1use std::collections::HashMap;
2
3use super::{
4    intrinsics::{
5        CtxType, FunctionCache, GlobalCache, Intrinsics, MemoryCache, tbaa_label, type_to_llvm,
6    },
7    state::{ControlFrame, ExtraInfo, IfElseState, State, TagCatchInfo},
9};
10use inkwell::{
11    AddressSpace, AtomicOrdering, AtomicRMWBinOp, DLLStorageClass, FloatPredicate, IntPredicate,
12    attributes::AttributeLoc,
13    builder::Builder,
14    context::Context,
15    module::{Linkage, Module},
16    passes::PassBuilderOptions,
17    targets::{FileType, TargetMachine},
18    types::{BasicType, BasicTypeEnum, FloatMathType, IntType, PointerType, VectorType},
19    values::{
20        BasicMetadataValueEnum, BasicValue, BasicValueEnum, CallSiteValue, FloatValue,
21        FunctionValue, InstructionOpcode, InstructionValue, IntValue, PhiValue, PointerValue,
22        VectorValue,
23    },
24};
25use itertools::Itertools;
26use smallvec::SmallVec;
27use target_lexicon::BinaryFormat;
28
29use crate::{
30    abi::{Abi, G0M0FunctionKind, LocalFunctionG0M0params, get_abi},
31    config::{CompiledKind, LLVM},
32    error::{err, err_nt},
33    object_file::{CompiledFunction, load_object_file},
34};
35use wasmer_compiler::{
36    FunctionBinaryReader, FunctionBodyData, MiddlewareBinaryReader, ModuleMiddlewareChain,
37    ModuleTranslationState, from_binaryreadererror_wasmerror,
38    types::{
39        relocation::RelocationTarget,
40        symbols::{Symbol, SymbolRegistry},
41    },
42    wasmparser::{Catch, MemArg, Operator},
43    wpheaptype_to_type, wptype_to_type,
44};
45use wasmer_types::{
46    CompileError, FunctionIndex, FunctionType, GlobalIndex, LocalFunctionIndex, MemoryIndex,
47    ModuleInfo, SignatureIndex, TableIndex, Type,
48};
49use wasmer_types::{TagIndex, entity::PrimaryMap};
50use wasmer_vm::{MemoryStyle, TableStyle, VMOffsets};
51
52const FUNCTION_SECTION_ELF: &str = "__TEXT,wasmer_function";
53const FUNCTION_SECTION_MACHO: &str = "__TEXT";
54const FUNCTION_SEGMENT_MACHO: &str = "wasmer_function";
55
56const CATCH_ALL_TAG_VALUE: i32 = i32::MAX;
62
63pub struct FuncTranslator {
64    ctx: Context,
65    target_machine: TargetMachine,
66    abi: Box<dyn Abi>,
67    binary_fmt: BinaryFormat,
68    func_section: String,
69}
70
71impl FuncTranslator {
72    pub fn new(
73        target_machine: TargetMachine,
74        binary_fmt: BinaryFormat,
75    ) -> Result<Self, CompileError> {
76        let abi = get_abi(&target_machine);
77        Ok(Self {
78            ctx: Context::create(),
79            target_machine,
80            abi,
81            func_section: match binary_fmt {
82                BinaryFormat::Elf => FUNCTION_SECTION_ELF.to_string(),
83                BinaryFormat::Macho => FUNCTION_SEGMENT_MACHO.to_string(),
84                _ => {
85                    return Err(CompileError::UnsupportedTarget(format!(
86                        "Unsupported binary format: {binary_fmt:?}"
87                    )));
88                }
89            },
90            binary_fmt,
91        })
92    }
93
94    #[allow(clippy::too_many_arguments)]
95    pub fn translate_to_module(
96        &self,
97        wasm_module: &ModuleInfo,
98        module_translation: &ModuleTranslationState,
99        local_func_index: &LocalFunctionIndex,
100        function_body: &FunctionBodyData,
101        config: &LLVM,
102        memory_styles: &PrimaryMap<MemoryIndex, MemoryStyle>,
103        _table_styles: &PrimaryMap<TableIndex, TableStyle>,
104        symbol_registry: &dyn SymbolRegistry,
105    ) -> Result<Module<'_>, CompileError> {
106        let function = CompiledKind::Local(*local_func_index);
108        let func_index = wasm_module.func_index(*local_func_index);
109        let function_name =
110            symbol_registry.symbol_to_name(Symbol::LocalFunction(*local_func_index));
111
112        let g0m0_is_enabled = config.enable_g0m0_opt;
113        let func_kind = if g0m0_is_enabled {
114            Some(G0M0FunctionKind::Local)
115        } else {
116            None
117        };
118
119        let module_name = match wasm_module.name.as_ref() {
120            None => format!("<anonymous module> function {function_name}"),
121            Some(module_name) => format!("module {module_name} function {function_name}"),
122        };
123        let module = self.ctx.create_module(module_name.as_str());
124
125        let target_machine = &self.target_machine;
126        let target_triple = target_machine.get_triple();
127        let target_data = target_machine.get_target_data();
128        module.set_triple(&target_triple);
129        module.set_data_layout(&target_data.get_data_layout());
130        let wasm_fn_type = wasm_module
131            .signatures
132            .get(wasm_module.functions[func_index])
133            .unwrap();
134
135        let offsets = VMOffsets::new(8, wasm_module);
137        let intrinsics = Intrinsics::declare(&module, &self.ctx, &target_data, &self.binary_fmt);
138        let (func_type, func_attrs) = self.abi.func_type_to_llvm(
139            &self.ctx,
140            &intrinsics,
141            Some(&offsets),
142            wasm_fn_type,
143            func_kind,
144        )?;
145
146        let func = module.add_function(&function_name, func_type, Some(Linkage::External));
147        for (attr, attr_loc) in &func_attrs {
148            func.add_attribute(*attr_loc, *attr);
149        }
150
151        func.add_attribute(AttributeLoc::Function, intrinsics.stack_probe);
152        func.add_attribute(AttributeLoc::Function, intrinsics.uwtable);
153        func.add_attribute(AttributeLoc::Function, intrinsics.frame_pointer);
154
155        let section = match self.binary_fmt {
156            BinaryFormat::Elf => FUNCTION_SECTION_ELF.to_string(),
157            BinaryFormat::Macho => {
158                format!("{FUNCTION_SECTION_MACHO},{FUNCTION_SEGMENT_MACHO}")
159            }
160            _ => {
161                return Err(CompileError::UnsupportedTarget(format!(
162                    "Unsupported binary format: {:?}",
163                    self.binary_fmt
164                )));
165            }
166        };
167
168        func.set_personality_function(intrinsics.personality);
169        func.as_global_value().set_section(Some(§ion));
170
171        func.set_linkage(Linkage::DLLExport);
172        func.as_global_value()
173            .set_dll_storage_class(DLLStorageClass::Export);
174
175        let entry = self.ctx.append_basic_block(func, "entry");
176        let start_of_code = self.ctx.append_basic_block(func, "start_of_code");
177        let return_ = self.ctx.append_basic_block(func, "return");
178        let alloca_builder = self.ctx.create_builder();
179        let cache_builder = self.ctx.create_builder();
180        let builder = self.ctx.create_builder();
181        cache_builder.position_at_end(entry);
182        let br = err!(cache_builder.build_unconditional_branch(start_of_code));
183        alloca_builder.position_before(&br);
184        cache_builder.position_before(&br);
185        builder.position_at_end(start_of_code);
186
187        let mut state = State::new();
188        builder.position_at_end(return_);
189        let phis: SmallVec<[PhiValue; 1]> = wasm_fn_type
190            .results()
191            .iter()
192            .map(|&wasm_ty| {
193                type_to_llvm(&intrinsics, wasm_ty).map(|ty| builder.build_phi(ty, "").unwrap())
194            })
195            .collect::<Result<_, _>>()?;
196        state.push_block(return_, phis, 0);
197        builder.position_at_end(start_of_code);
198
199        let mut reader = MiddlewareBinaryReader::new_with_offset(
200            function_body.data,
201            function_body.module_offset,
202        );
203        reader.set_middleware_chain(
204            config
205                .middlewares
206                .generate_function_middleware_chain(*local_func_index),
207        );
208
209        let mut params = vec![];
210        let first_param =
211            if func_type.get_return_type().is_none() && wasm_fn_type.results().len() > 1 {
212                if g0m0_is_enabled { 4 } else { 2 }
213            } else if g0m0_is_enabled {
214                3
215            } else {
216                1
217            };
218        let mut is_first_alloca = true;
219        let mut insert_alloca = |ty, name: String| -> Result<PointerValue, CompileError> {
220            let alloca = err!(alloca_builder.build_alloca(ty, &name));
221            if is_first_alloca {
222                alloca_builder.position_at(entry, &alloca.as_instruction_value().unwrap());
223                is_first_alloca = false;
224            }
225            Ok(alloca)
226        };
227
228        for idx in 0..wasm_fn_type.params().len() {
246            let ty = wasm_fn_type.params()[idx];
247            let ty = type_to_llvm(&intrinsics, ty)?;
248            let value = func
249                .get_nth_param((idx as u32).checked_add(first_param).unwrap())
250                .unwrap();
251            let alloca = insert_alloca(ty, format!("param_{idx}"))?;
252            err!(cache_builder.build_store(alloca, value));
253            params.push((ty, alloca));
254        }
255
256        let mut locals = vec![];
257        let num_locals = reader.read_local_count()?;
258        for idx in 0..num_locals {
259            let (count, ty) = reader.read_local_decl()?;
260            let ty = err!(wptype_to_type(ty));
261            let ty = type_to_llvm(&intrinsics, ty)?;
262            for _ in 0..count {
263                let alloca = insert_alloca(ty, format!("local_{idx}"))?;
264                err!(cache_builder.build_store(alloca, ty.const_zero()));
265                locals.push((ty, alloca));
266            }
267        }
268
269        let mut params_locals = params.clone();
270        params_locals.extend(locals.iter().cloned());
271
272        let mut g0m0_params = None;
273
274        if g0m0_is_enabled {
275            let value = self.abi.get_g0_ptr_param(&func);
276            let g0 = insert_alloca(intrinsics.i32_ty.as_basic_type_enum(), "g0".to_string())?;
277            err!(cache_builder.build_store(g0, value));
278            g0.set_name("g0");
279            let m0 = self.abi.get_m0_ptr_param(&func);
280            m0.set_name("m0_base_ptr");
281
282            g0m0_params = Some((g0, m0));
283        }
284
285        let mut fcg = LLVMFunctionCodeGenerator {
286            g0m0: g0m0_params,
287            context: &self.ctx,
288            builder,
289            alloca_builder,
290            intrinsics: &intrinsics,
291            state,
292            function: func,
293            locals: params_locals,
294            ctx: CtxType::new(wasm_module, &func, &cache_builder, &*self.abi, config),
295            unreachable_depth: 0,
296            memory_styles,
297            _table_styles,
298            module: &module,
299            module_translation,
300            wasm_module,
301            symbol_registry,
302            abi: &*self.abi,
303            config,
304            tags_cache: HashMap::new(),
305            binary_fmt: self.binary_fmt,
306        };
307
308        fcg.ctx.add_func(
309            func_index,
310            func.as_global_value().as_pointer_value(),
311            func_type,
312            fcg.ctx.basic(),
313            &func_attrs,
314        );
315
316        while fcg.state.has_control_frames() {
317            let pos = reader.current_position() as u32;
318            let op = reader.read_operator()?;
319            fcg.translate_operator(op, pos)?;
320        }
321
322        fcg.finalize(wasm_fn_type)?;
323
324        if let Some(ref callbacks) = config.callbacks {
325            callbacks.preopt_ir(&function, &module);
326        }
327
328        let mut passes = vec![];
329
330        if config.enable_verifier {
331            passes.push("verify");
332        }
333
334        passes.push("sccp");
335        passes.push("early-cse");
336        passes.push("adce");
338        passes.push("sroa");
339        passes.push("aggressive-instcombine");
340        passes.push("jump-threading");
341        passes.push("simplifycfg");
343        passes.push("reassociate");
344        passes.push("loop-rotate");
345        passes.push("indvars");
346        passes.push("sccp");
350        passes.push("reassociate");
351        passes.push("simplifycfg");
352        passes.push("gvn");
353        passes.push("memcpyopt");
354        passes.push("dse");
355        passes.push("dce");
356        passes.push("reassociate");
358        passes.push("simplifycfg");
359        passes.push("mem2reg");
360
361        module
372            .run_passes(
373                passes.join(",").as_str(),
374                target_machine,
375                PassBuilderOptions::create(),
376            )
377            .unwrap();
378
379        if let Some(ref callbacks) = config.callbacks {
388            callbacks.postopt_ir(&function, &module);
389        }
390
391        Ok(module)
392    }
393
394    #[allow(clippy::too_many_arguments)]
395    pub fn translate(
396        &self,
397        wasm_module: &ModuleInfo,
398        module_translation: &ModuleTranslationState,
399        local_func_index: &LocalFunctionIndex,
400        function_body: &FunctionBodyData,
401        config: &LLVM,
402        memory_styles: &PrimaryMap<MemoryIndex, MemoryStyle>,
403        table_styles: &PrimaryMap<TableIndex, TableStyle>,
404        symbol_registry: &dyn SymbolRegistry,
405    ) -> Result<CompiledFunction, CompileError> {
406        let module = self.translate_to_module(
407            wasm_module,
408            module_translation,
409            local_func_index,
410            function_body,
411            config,
412            memory_styles,
413            table_styles,
414            symbol_registry,
415        )?;
416        let function = CompiledKind::Local(*local_func_index);
417        let target_machine = &self.target_machine;
418        let memory_buffer = target_machine
419            .write_to_memory_buffer(&module, FileType::Object)
420            .unwrap();
421
422        if let Some(ref callbacks) = config.callbacks {
423            callbacks.obj_memory_buffer(&function, &memory_buffer);
424            let asm_buffer = target_machine
425                .write_to_memory_buffer(&module, FileType::Assembly)
426                .unwrap();
427            callbacks.asm_memory_buffer(&function, &asm_buffer)
428        }
429
430        let mem_buf_slice = memory_buffer.as_slice();
431
432        load_object_file(
433            mem_buf_slice,
434            &self.func_section,
435            RelocationTarget::LocalFunc(*local_func_index),
436            |name: &str| {
437                Ok({
438                    let name = if matches!(self.binary_fmt, BinaryFormat::Macho) {
439                        if name.starts_with("_") {
440                            name.replacen("_", "", 1)
441                        } else {
442                            name.to_string()
443                        }
444                    } else {
445                        name.to_string()
446                    };
447                    if let Some(Symbol::LocalFunction(local_func_index)) =
448                        symbol_registry.name_to_symbol(&name)
449                    {
450                        Some(RelocationTarget::LocalFunc(local_func_index))
451                    } else {
452                        None
453                    }
454                })
455            },
456            self.binary_fmt,
457        )
458    }
459}
460
461impl<'ctx> LLVMFunctionCodeGenerator<'ctx, '_> {
462    fn splat_vector(
464        &self,
465        value: BasicValueEnum<'ctx>,
466        vec_ty: VectorType<'ctx>,
467    ) -> Result<VectorValue<'ctx>, CompileError> {
468        err_nt!(
471            self.builder.build_shuffle_vector(
472                err!(self.builder.build_insert_element(
473                    vec_ty.get_undef(),
474                    value,
475                    self.intrinsics.i32_zero,
476                    "",
477                )),
478                vec_ty.get_undef(),
479                self.intrinsics
480                    .i32_ty
481                    .vec_type(vec_ty.get_size())
482                    .const_zero(),
483                "",
484            )
485        )
486    }
487
488    #[allow(clippy::too_many_arguments)]
491    fn trunc_sat<T: FloatMathType<'ctx>>(
492        &self,
493        fvec_ty: T,
494        ivec_ty: T::MathConvType,
495        lower_bound: u64, upper_bound: u64, int_min_value: u64,
498        int_max_value: u64,
499        value: IntValue<'ctx>,
500    ) -> Result<VectorValue<'ctx>, CompileError> {
501        let fvec_ty = fvec_ty.as_basic_type_enum().into_vector_type();
515        let ivec_ty = ivec_ty.as_basic_type_enum().into_vector_type();
516        let fvec_element_ty = fvec_ty.get_element_type().into_float_type();
517        let ivec_element_ty = ivec_ty.get_element_type().into_int_type();
518
519        let is_signed = int_min_value != 0;
520        let int_min_value = self.splat_vector(
521            ivec_element_ty
522                .const_int(int_min_value, is_signed)
523                .as_basic_value_enum(),
524            ivec_ty,
525        )?;
526        let int_max_value = self.splat_vector(
527            ivec_element_ty
528                .const_int(int_max_value, is_signed)
529                .as_basic_value_enum(),
530            ivec_ty,
531        )?;
532        let lower_bound = if is_signed {
533            err!(self.builder.build_signed_int_to_float(
534                ivec_element_ty.const_int(lower_bound, is_signed),
535                fvec_element_ty,
536                "",
537            ))
538        } else {
539            err!(self.builder.build_unsigned_int_to_float(
540                ivec_element_ty.const_int(lower_bound, is_signed),
541                fvec_element_ty,
542                "",
543            ))
544        };
545        let upper_bound = if is_signed {
546            err!(self.builder.build_signed_int_to_float(
547                ivec_element_ty.const_int(upper_bound, is_signed),
548                fvec_element_ty,
549                "",
550            ))
551        } else {
552            err!(self.builder.build_unsigned_int_to_float(
553                ivec_element_ty.const_int(upper_bound, is_signed),
554                fvec_element_ty,
555                "",
556            ))
557        };
558
559        let value = err!(self.builder.build_bit_cast(value, fvec_ty, "")).into_vector_value();
560        let zero = fvec_ty.const_zero();
561        let lower_bound = self.splat_vector(lower_bound.as_basic_value_enum(), fvec_ty)?;
562        let upper_bound = self.splat_vector(upper_bound.as_basic_value_enum(), fvec_ty)?;
563        let nan_cmp =
564            err!(
565                self.builder
566                    .build_float_compare(FloatPredicate::UNO, value, zero, "nan")
567            );
568        let above_upper_bound_cmp = err!(self.builder.build_float_compare(
569            FloatPredicate::OGT,
570            value,
571            upper_bound,
572            "above_upper_bound",
573        ));
574        let below_lower_bound_cmp = err!(self.builder.build_float_compare(
575            FloatPredicate::OLT,
576            value,
577            lower_bound,
578            "below_lower_bound",
579        ));
580        let not_representable = err!(self.builder.build_or(
581            err!(self.builder.build_or(nan_cmp, above_upper_bound_cmp, "")),
582            below_lower_bound_cmp,
583            "not_representable_as_int",
584        ));
585        let value =
586            err!(
587                self.builder
588                    .build_select(not_representable, zero, value, "safe_to_convert")
589            )
590            .into_vector_value();
591        let value = if is_signed {
592            self.builder
593                .build_float_to_signed_int(value, ivec_ty, "as_int")
594        } else {
595            self.builder
596                .build_float_to_unsigned_int(value, ivec_ty, "as_int")
597        };
598
599        let value = err!(value);
600        let value =
601            err!(
602                self.builder
603                    .build_select(above_upper_bound_cmp, int_max_value, value, "")
604            )
605            .into_vector_value();
606        err_nt!(
607            self.builder
608                .build_select(below_lower_bound_cmp, int_min_value, value, "")
609                .map(|v| v.into_vector_value())
610        )
611    }
612
613    #[allow(clippy::too_many_arguments)]
616    fn trunc_sat_into_int<T: FloatMathType<'ctx>>(
617        &self,
618        fvec_ty: T,
619        ivec_ty: T::MathConvType,
620        lower_bound: u64, upper_bound: u64, int_min_value: u64,
623        int_max_value: u64,
624        value: IntValue<'ctx>,
625    ) -> Result<IntValue<'ctx>, CompileError> {
626        let res = self.trunc_sat(
627            fvec_ty,
628            ivec_ty,
629            lower_bound,
630            upper_bound,
631            int_min_value,
632            int_max_value,
633            value,
634        )?;
635        err_nt!(
636            self.builder
637                .build_bit_cast(res, self.intrinsics.i128_ty, "")
638                .map(|v| v.into_int_value())
639        )
640    }
641
642    fn trunc_sat_scalar(
645        &self,
646        int_ty: IntType<'ctx>,
647        lower_bound: u64, upper_bound: u64, int_min_value: u64,
650        int_max_value: u64,
651        value: FloatValue<'ctx>,
652    ) -> Result<IntValue<'ctx>, CompileError> {
653        let is_signed = int_min_value != 0;
669        let int_min_value = int_ty.const_int(int_min_value, is_signed);
670        let int_max_value = int_ty.const_int(int_max_value, is_signed);
671
672        let lower_bound = if is_signed {
673            err!(self.builder.build_signed_int_to_float(
674                int_ty.const_int(lower_bound, is_signed),
675                value.get_type(),
676                "",
677            ))
678        } else {
679            err!(self.builder.build_unsigned_int_to_float(
680                int_ty.const_int(lower_bound, is_signed),
681                value.get_type(),
682                "",
683            ))
684        };
685        let upper_bound = if is_signed {
686            err!(self.builder.build_signed_int_to_float(
687                int_ty.const_int(upper_bound, is_signed),
688                value.get_type(),
689                "",
690            ))
691        } else {
692            err!(self.builder.build_unsigned_int_to_float(
693                int_ty.const_int(upper_bound, is_signed),
694                value.get_type(),
695                "",
696            ))
697        };
698
699        let zero = value.get_type().const_zero();
700
701        let nan_cmp =
702            err!(
703                self.builder
704                    .build_float_compare(FloatPredicate::UNO, value, zero, "nan")
705            );
706        let above_upper_bound_cmp = err!(self.builder.build_float_compare(
707            FloatPredicate::OGT,
708            value,
709            upper_bound,
710            "above_upper_bound",
711        ));
712        let below_lower_bound_cmp = err!(self.builder.build_float_compare(
713            FloatPredicate::OLT,
714            value,
715            lower_bound,
716            "below_lower_bound",
717        ));
718        let not_representable = err!(self.builder.build_or(
719            err!(self.builder.build_or(nan_cmp, above_upper_bound_cmp, "")),
720            below_lower_bound_cmp,
721            "not_representable_as_int",
722        ));
723        let value =
724            err!(
725                self.builder
726                    .build_select(not_representable, zero, value, "safe_to_convert")
727            )
728            .into_float_value();
729        let value = if is_signed {
730            err!(
731                self.builder
732                    .build_float_to_signed_int(value, int_ty, "as_int")
733            )
734        } else {
735            err!(
736                self.builder
737                    .build_float_to_unsigned_int(value, int_ty, "as_int")
738            )
739        };
740        let value =
741            err!(
742                self.builder
743                    .build_select(above_upper_bound_cmp, int_max_value, value, "")
744            )
745            .into_int_value();
746        let value =
747            err!(
748                self.builder
749                    .build_select(below_lower_bound_cmp, int_min_value, value, "")
750            )
751            .into_int_value();
752
753        err_nt!(
754            self.builder
755                .build_bit_cast(value, int_ty, "")
756                .map(|v| v.into_int_value())
757        )
758    }
759
760    fn trap_if_not_representable_as_int(
761        &self,
762        lower_bound: u64, upper_bound: u64, value: FloatValue,
765    ) -> Result<(), CompileError> {
766        let float_ty = value.get_type();
767        let int_ty = if float_ty == self.intrinsics.f32_ty {
768            self.intrinsics.i32_ty
769        } else {
770            self.intrinsics.i64_ty
771        };
772
773        let lower_bound = err!(self.builder.build_bit_cast(
774            int_ty.const_int(lower_bound, false),
775            float_ty,
776            ""
777        ))
778        .into_float_value();
779        let upper_bound = err!(self.builder.build_bit_cast(
780            int_ty.const_int(upper_bound, false),
781            float_ty,
782            ""
783        ))
784        .into_float_value();
785
786        let above_upper_bound_cmp = err!(self.builder.build_float_compare(
790            FloatPredicate::UGT,
791            value,
792            upper_bound,
793            "above_upper_bound",
794        ));
795        let below_lower_bound_cmp = err!(self.builder.build_float_compare(
796            FloatPredicate::ULT,
797            value,
798            lower_bound,
799            "below_lower_bound",
800        ));
801        let out_of_bounds = err!(self.builder.build_or(
802            above_upper_bound_cmp,
803            below_lower_bound_cmp,
804            "out_of_bounds",
805        ));
806
807        let failure_block = self
808            .context
809            .append_basic_block(self.function, "conversion_failure_block");
810        let continue_block = self
811            .context
812            .append_basic_block(self.function, "conversion_success_block");
813
814        err!(
815            self.builder
816                .build_conditional_branch(out_of_bounds, failure_block, continue_block)
817        );
818        self.builder.position_at_end(failure_block);
819        let is_nan =
820            err!(
821                self.builder
822                    .build_float_compare(FloatPredicate::UNO, value, value, "is_nan")
823            );
824        let trap_code = err!(self.builder.build_select(
825            is_nan,
826            self.intrinsics.trap_bad_conversion_to_integer,
827            self.intrinsics.trap_illegal_arithmetic,
828            "",
829        ));
830        err!(
831            self.builder
832                .build_call(self.intrinsics.throw_trap, &[trap_code.into()], "throw")
833        );
834        err!(self.builder.build_unreachable());
835        self.builder.position_at_end(continue_block);
836
837        Ok(())
838    }
839
840    fn trap_if_zero_or_overflow(
841        &self,
842        left: IntValue,
843        right: IntValue,
844    ) -> Result<(), CompileError> {
845        let int_type = left.get_type();
846
847        let (min_value, neg_one_value) = if int_type == self.intrinsics.i32_ty {
848            let min_value = int_type.const_int(i32::MIN as u64, false);
849            let neg_one_value = int_type.const_int(-1i32 as u32 as u64, false);
850            (min_value, neg_one_value)
851        } else if int_type == self.intrinsics.i64_ty {
852            let min_value = int_type.const_int(i64::MIN as u64, false);
853            let neg_one_value = int_type.const_int(-1i64 as u64, false);
854            (min_value, neg_one_value)
855        } else {
856            unreachable!()
857        };
858
859        let divisor_is_zero = err!(self.builder.build_int_compare(
860            IntPredicate::EQ,
861            right,
862            int_type.const_zero(),
863            "divisor_is_zero",
864        ));
865        let should_trap = err!(self.builder.build_or(
866            divisor_is_zero,
867            err!(self.builder.build_and(
868                err!(self.builder.build_int_compare(
869                    IntPredicate::EQ,
870                    left,
871                    min_value,
872                    "left_is_min"
873                )),
874                err!(self.builder.build_int_compare(
875                    IntPredicate::EQ,
876                    right,
877                    neg_one_value,
878                    "right_is_neg_one",
879                )),
880                "div_will_overflow",
881            )),
882            "div_should_trap",
883        ));
884
885        let should_trap = err!(self.builder.build_call(
886            self.intrinsics.expect_i1,
887            &[
888                should_trap.into(),
889                self.intrinsics.i1_ty.const_zero().into(),
890            ],
891            "should_trap_expect",
892        ))
893        .try_as_basic_value()
894        .left()
895        .unwrap()
896        .into_int_value();
897
898        let shouldnt_trap_block = self
899            .context
900            .append_basic_block(self.function, "shouldnt_trap_block");
901        let should_trap_block = self
902            .context
903            .append_basic_block(self.function, "should_trap_block");
904        err!(self.builder.build_conditional_branch(
905            should_trap,
906            should_trap_block,
907            shouldnt_trap_block
908        ));
909        self.builder.position_at_end(should_trap_block);
910        let trap_code = err!(self.builder.build_select(
911            divisor_is_zero,
912            self.intrinsics.trap_integer_division_by_zero,
913            self.intrinsics.trap_illegal_arithmetic,
914            "",
915        ));
916        err!(
917            self.builder
918                .build_call(self.intrinsics.throw_trap, &[trap_code.into()], "throw")
919        );
920        err!(self.builder.build_unreachable());
921        self.builder.position_at_end(shouldnt_trap_block);
922
923        Ok(())
924    }
925
926    fn trap_if_zero(&self, value: IntValue) -> Result<(), CompileError> {
927        let int_type = value.get_type();
928        let should_trap = err!(self.builder.build_int_compare(
929            IntPredicate::EQ,
930            value,
931            int_type.const_zero(),
932            "divisor_is_zero",
933        ));
934
935        let should_trap = err!(self.builder.build_call(
936            self.intrinsics.expect_i1,
937            &[
938                should_trap.into(),
939                self.intrinsics.i1_ty.const_zero().into(),
940            ],
941            "should_trap_expect",
942        ))
943        .try_as_basic_value()
944        .left()
945        .unwrap()
946        .into_int_value();
947
948        let shouldnt_trap_block = self
949            .context
950            .append_basic_block(self.function, "shouldnt_trap_block");
951        let should_trap_block = self
952            .context
953            .append_basic_block(self.function, "should_trap_block");
954        err!(self.builder.build_conditional_branch(
955            should_trap,
956            should_trap_block,
957            shouldnt_trap_block
958        ));
959        self.builder.position_at_end(should_trap_block);
960        err!(self.builder.build_call(
961            self.intrinsics.throw_trap,
962            &[self.intrinsics.trap_integer_division_by_zero.into()],
963            "throw",
964        ));
965        err!(self.builder.build_unreachable());
966        self.builder.position_at_end(shouldnt_trap_block);
967
968        Ok(())
969    }
970
971    fn v128_into_int_vec(
972        &self,
973        value: BasicValueEnum<'ctx>,
974        info: ExtraInfo,
975        int_vec_ty: VectorType<'ctx>,
976    ) -> Result<(VectorValue<'ctx>, ExtraInfo), CompileError> {
977        let (value, info) = if info.has_pending_f32_nan() {
978            let value = err!(
979                self.builder
980                    .build_bit_cast(value, self.intrinsics.f32x4_ty, "")
981            );
982            (self.canonicalize_nans(value)?, info.strip_pending())
983        } else if info.has_pending_f64_nan() {
984            let value = err!(
985                self.builder
986                    .build_bit_cast(value, self.intrinsics.f64x2_ty, "")
987            );
988            (self.canonicalize_nans(value)?, info.strip_pending())
989        } else {
990            (value, info)
991        };
992        Ok((
993            err!(self.builder.build_bit_cast(value, int_vec_ty, "")).into_vector_value(),
994            info,
995        ))
996    }
997
998    fn v128_into_i8x16(
999        &self,
1000        value: BasicValueEnum<'ctx>,
1001        info: ExtraInfo,
1002    ) -> Result<(VectorValue<'ctx>, ExtraInfo), CompileError> {
1003        self.v128_into_int_vec(value, info, self.intrinsics.i8x16_ty)
1004    }
1005
1006    fn v128_into_i16x8(
1007        &self,
1008        value: BasicValueEnum<'ctx>,
1009        info: ExtraInfo,
1010    ) -> Result<(VectorValue<'ctx>, ExtraInfo), CompileError> {
1011        self.v128_into_int_vec(value, info, self.intrinsics.i16x8_ty)
1012    }
1013
1014    fn v128_into_i32x4(
1015        &self,
1016        value: BasicValueEnum<'ctx>,
1017        info: ExtraInfo,
1018    ) -> Result<(VectorValue<'ctx>, ExtraInfo), CompileError> {
1019        self.v128_into_int_vec(value, info, self.intrinsics.i32x4_ty)
1020    }
1021
1022    fn v128_into_i64x2(
1023        &self,
1024        value: BasicValueEnum<'ctx>,
1025        info: ExtraInfo,
1026    ) -> Result<(VectorValue<'ctx>, ExtraInfo), CompileError> {
1027        self.v128_into_int_vec(value, info, self.intrinsics.i64x2_ty)
1028    }
1029
1030    fn v128_into_f32x4(
1033        &self,
1034        value: BasicValueEnum<'ctx>,
1035        info: ExtraInfo,
1036    ) -> Result<(VectorValue<'ctx>, ExtraInfo), CompileError> {
1037        let (value, info) = if info.has_pending_f64_nan() {
1038            let value = err!(
1039                self.builder
1040                    .build_bit_cast(value, self.intrinsics.f64x2_ty, "")
1041            );
1042            (self.canonicalize_nans(value)?, info.strip_pending())
1043        } else {
1044            (value, info)
1045        };
1046        Ok((
1047            err!(
1048                self.builder
1049                    .build_bit_cast(value, self.intrinsics.f32x4_ty, "")
1050            )
1051            .into_vector_value(),
1052            info,
1053        ))
1054    }
1055
1056    fn v128_into_f64x2(
1059        &self,
1060        value: BasicValueEnum<'ctx>,
1061        info: ExtraInfo,
1062    ) -> Result<(VectorValue<'ctx>, ExtraInfo), CompileError> {
1063        let (value, info) = if info.has_pending_f32_nan() {
1064            let value = err!(
1065                self.builder
1066                    .build_bit_cast(value, self.intrinsics.f32x4_ty, "")
1067            );
1068            (self.canonicalize_nans(value)?, info.strip_pending())
1069        } else {
1070            (value, info)
1071        };
1072        Ok((
1073            err!(
1074                self.builder
1075                    .build_bit_cast(value, self.intrinsics.f64x2_ty, "")
1076            )
1077            .into_vector_value(),
1078            info,
1079        ))
1080    }
1081
1082    fn apply_pending_canonicalization(
1083        &self,
1084        value: BasicValueEnum<'ctx>,
1085        info: ExtraInfo,
1086    ) -> Result<BasicValueEnum<'ctx>, CompileError> {
1087        if !self.config.enable_nan_canonicalization {
1088            return Ok(value);
1089        }
1090
1091        if info.has_pending_f32_nan() {
1092            if value.get_type().is_vector_type()
1093                || value.get_type() == self.intrinsics.i128_ty.as_basic_type_enum()
1094            {
1095                let ty = value.get_type();
1096                let value = err!(
1097                    self.builder
1098                        .build_bit_cast(value, self.intrinsics.f32x4_ty, "")
1099                );
1100                let value = self.canonicalize_nans(value)?;
1101                err_nt!(self.builder.build_bit_cast(value, ty, ""))
1102            } else {
1103                self.canonicalize_nans(value)
1104            }
1105        } else if info.has_pending_f64_nan() {
1106            if value.get_type().is_vector_type()
1107                || value.get_type() == self.intrinsics.i128_ty.as_basic_type_enum()
1108            {
1109                let ty = value.get_type();
1110                let value = err!(
1111                    self.builder
1112                        .build_bit_cast(value, self.intrinsics.f64x2_ty, "")
1113                );
1114                let value = self.canonicalize_nans(value)?;
1115                err_nt!(self.builder.build_bit_cast(value, ty, ""))
1116            } else {
1117                self.canonicalize_nans(value)
1118            }
1119        } else {
1120            Ok(value)
1121        }
1122    }
1123
1124    fn canonicalize_nans(
1126        &self,
1127        value: BasicValueEnum<'ctx>,
1128    ) -> Result<BasicValueEnum<'ctx>, CompileError> {
1129        if !self.config.enable_nan_canonicalization {
1130            return Ok(value);
1131        }
1132
1133        let f_ty = value.get_type();
1134        if f_ty.is_vector_type() {
1135            let value = value.into_vector_value();
1136            let f_ty = f_ty.into_vector_type();
1137            let zero = f_ty.const_zero();
1138            let nan_cmp =
1139                err!(
1140                    self.builder
1141                        .build_float_compare(FloatPredicate::UNO, value, zero, "nan")
1142                );
1143            let canonical_qnan = f_ty
1144                .get_element_type()
1145                .into_float_type()
1146                .const_float(f64::NAN);
1147            let canonical_qnan = self.splat_vector(canonical_qnan.as_basic_value_enum(), f_ty)?;
1148            err_nt!(
1149                self.builder
1150                    .build_select(nan_cmp, canonical_qnan, value, "")
1151                    .map(|v| v.as_basic_value_enum())
1152            )
1153        } else {
1154            let value = value.into_float_value();
1155            let f_ty = f_ty.into_float_type();
1156            let zero = f_ty.const_zero();
1157            let nan_cmp =
1158                err!(
1159                    self.builder
1160                        .build_float_compare(FloatPredicate::UNO, value, zero, "nan")
1161                );
1162            let canonical_qnan = f_ty.const_float(f64::NAN);
1163            err_nt!(
1164                self.builder
1165                    .build_select(nan_cmp, canonical_qnan, value, "")
1166                    .map(|v| v.as_basic_value_enum())
1167            )
1168        }
1169    }
1170
1171    fn quiet_nan(&self, value: BasicValueEnum<'ctx>) -> Result<BasicValueEnum<'ctx>, CompileError> {
1172        let intrinsic = if value
1173            .get_type()
1174            .eq(&self.intrinsics.f32_ty.as_basic_type_enum())
1175        {
1176            Some(self.intrinsics.add_f32)
1177        } else if value
1178            .get_type()
1179            .eq(&self.intrinsics.f64_ty.as_basic_type_enum())
1180        {
1181            Some(self.intrinsics.add_f64)
1182        } else if value
1183            .get_type()
1184            .eq(&self.intrinsics.f32x4_ty.as_basic_type_enum())
1185        {
1186            Some(self.intrinsics.add_f32x4)
1187        } else if value
1188            .get_type()
1189            .eq(&self.intrinsics.f64x2_ty.as_basic_type_enum())
1190        {
1191            Some(self.intrinsics.add_f64x2)
1192        } else {
1193            None
1194        };
1195
1196        match intrinsic {
1197            Some(intrinsic) => err_nt!(
1198                self.builder
1199                    .build_call(
1200                        intrinsic,
1201                        &[
1202                            value.into(),
1203                            value.get_type().const_zero().into(),
1204                            self.intrinsics.fp_rounding_md,
1205                            self.intrinsics.fp_exception_md,
1206                        ],
1207                        "",
1208                    )
1209                    .map(|v| v.try_as_basic_value().left().unwrap())
1210            ),
1211            None => Ok(value),
1212        }
1213    }
1214
1215    fn mark_memaccess_nodelete(
1219        &mut self,
1220        memory_index: MemoryIndex,
1221        memaccess: InstructionValue<'ctx>,
1222    ) -> Result<(), CompileError> {
1223        if let MemoryCache::Static { base_ptr: _ } = self.ctx.memory(
1224            memory_index,
1225            self.intrinsics,
1226            self.module,
1227            self.memory_styles,
1228        )? {
1229            memaccess.set_volatile(true).unwrap();
1232        }
1233        Ok(())
1234    }
1235
1236    fn annotate_user_memaccess(
1237        &mut self,
1238        memory_index: MemoryIndex,
1239        _memarg: &MemArg,
1240        alignment: u32,
1241        memaccess: InstructionValue<'ctx>,
1242    ) -> Result<(), CompileError> {
1243        match memaccess.get_opcode() {
1244            InstructionOpcode::Load | InstructionOpcode::Store => {
1245                memaccess.set_alignment(alignment).unwrap();
1246            }
1247            _ => {}
1248        };
1249        self.mark_memaccess_nodelete(memory_index, memaccess)?;
1250        tbaa_label(
1251            self.module,
1252            self.intrinsics,
1253            format!("memory {}", memory_index.as_u32()),
1254            memaccess,
1255        );
1256        Ok(())
1257    }
1258
1259    fn resolve_memory_ptr(
1260        &mut self,
1261        memory_index: MemoryIndex,
1262        memarg: &MemArg,
1263        ptr_ty: PointerType<'ctx>,
1264        var_offset: IntValue<'ctx>,
1265        value_size: usize,
1266    ) -> Result<PointerValue<'ctx>, CompileError> {
1267        let builder = &self.builder;
1268        let intrinsics = &self.intrinsics;
1269        let context = &self.context;
1270        let function = &self.function;
1271
1272        let imm_offset = intrinsics.i64_ty.const_int(memarg.offset, false);
1274        let var_offset = err!(builder.build_int_z_extend(var_offset, intrinsics.i64_ty, ""));
1275        let offset = err!(builder.build_int_add(var_offset, imm_offset, ""));
1276
1277        let base_ptr = if let Some((_, ref m0)) = self.g0m0 {
1279            *m0
1280        } else {
1281            match self
1282                .ctx
1283                .memory(memory_index, intrinsics, self.module, self.memory_styles)?
1284            {
1285                MemoryCache::Dynamic {
1286                    ptr_to_base_ptr,
1287                    ptr_to_current_length,
1288                } => {
1289                    let minimum = self.wasm_module.memories[memory_index].minimum;
1291                    let value_size_v = intrinsics.i64_ty.const_int(value_size as u64, false);
1292                    let ptr_in_bounds = if offset.is_const() {
1293                        let load_offset_end = offset.const_add(value_size_v);
1296                        let ptr_in_bounds = load_offset_end.const_int_compare(
1297                            IntPredicate::ULE,
1298                            intrinsics.i64_ty.const_int(minimum.bytes().0 as u64, false),
1299                        );
1300                        if ptr_in_bounds.get_zero_extended_constant() == Some(1) {
1301                            Some(ptr_in_bounds)
1302                        } else {
1303                            None
1304                        }
1305                    } else {
1306                        None
1307                    };
1308
1309                    let ptr_in_bounds = match ptr_in_bounds {
1310                        Some(ptr) => ptr,
1311                        None => {
1312                            let load_offset_end = err!(builder.build_int_add(
1313                                offset,
1314                                value_size_v,
1315                                "load_offset_end"
1316                            ));
1317
1318                            let current_length = err!(builder.build_load(
1319                                self.intrinsics.i32_ty,
1320                                ptr_to_current_length,
1321                                "current_length"
1322                            ))
1323                            .into_int_value();
1324                            tbaa_label(
1325                                self.module,
1326                                self.intrinsics,
1327                                format!("memory {} length", memory_index.as_u32()),
1328                                current_length.as_instruction_value().unwrap(),
1329                            );
1330                            let current_length = err!(builder.build_int_z_extend(
1331                                current_length,
1332                                intrinsics.i64_ty,
1333                                "current_length_zextd"
1334                            ));
1335
1336                            err!(builder.build_int_compare(
1337                                IntPredicate::ULE,
1338                                load_offset_end,
1339                                current_length,
1340                                "ptr_in_bounds",
1341                            ))
1342                        }
1343                    };
1344
1345                    if !ptr_in_bounds.is_constant_int()
1346                        || ptr_in_bounds.get_zero_extended_constant().unwrap() != 1
1347                    {
1348                        let ptr_in_bounds = err!(builder.build_call(
1354                            intrinsics.expect_i1,
1355                            &[
1356                                ptr_in_bounds.into(),
1357                                intrinsics.i1_ty.const_int(1, true).into(),
1358                            ],
1359                            "ptr_in_bounds_expect",
1360                        ))
1361                        .try_as_basic_value()
1362                        .left()
1363                        .unwrap()
1364                        .into_int_value();
1365
1366                        let in_bounds_continue_block =
1367                            context.append_basic_block(*function, "in_bounds_continue_block");
1368                        let not_in_bounds_block =
1369                            context.append_basic_block(*function, "not_in_bounds_block");
1370                        err!(builder.build_conditional_branch(
1371                            ptr_in_bounds,
1372                            in_bounds_continue_block,
1373                            not_in_bounds_block,
1374                        ));
1375                        builder.position_at_end(not_in_bounds_block);
1376                        err!(builder.build_call(
1377                            intrinsics.throw_trap,
1378                            &[intrinsics.trap_memory_oob.into()],
1379                            "throw",
1380                        ));
1381                        err!(builder.build_unreachable());
1382                        builder.position_at_end(in_bounds_continue_block);
1383                    }
1384                    let ptr_to_base =
1385                        err!(builder.build_load(intrinsics.ptr_ty, ptr_to_base_ptr, "ptr_to_base"))
1386                            .into_pointer_value();
1387                    tbaa_label(
1388                        self.module,
1389                        self.intrinsics,
1390                        format!("memory base_ptr {}", memory_index.as_u32()),
1391                        ptr_to_base.as_instruction_value().unwrap(),
1392                    );
1393                    ptr_to_base
1394                }
1395                MemoryCache::Static { base_ptr } => base_ptr,
1396            }
1397        };
1398        let value_ptr = unsafe {
1399            err!(builder.build_gep(self.intrinsics.i8_ty, base_ptr, &[offset], "mem_value_ptr"))
1400        };
1401        err_nt!(
1402            builder
1403                .build_bit_cast(value_ptr, ptr_ty, "mem_value")
1404                .map(|v| v.into_pointer_value())
1405        )
1406    }
1407
1408    fn trap_if_misaligned(
1409        &self,
1410        _memarg: &MemArg,
1411        ptr: PointerValue<'ctx>,
1412        align: u8,
1413    ) -> Result<(), CompileError> {
1414        if align <= 1 {
1415            return Ok(());
1416        }
1417        let value = err!(self.builder.build_ptr_to_int(
1418            ptr,
1419            self.intrinsics.i64_ty,
1420            "mischeck_value"
1421        ));
1422        let and = err!(self.builder.build_and(
1423            value,
1424            self.intrinsics.i64_ty.const_int((align - 1).into(), false),
1425            "misaligncheck",
1426        ));
1427        let aligned = err!(self.builder.build_int_compare(
1428            IntPredicate::EQ,
1429            and,
1430            self.intrinsics.i64_zero,
1431            "is_aligned"
1432        ));
1433        let aligned = err!(self.builder.build_call(
1434            self.intrinsics.expect_i1,
1435            &[
1436                aligned.into(),
1437                self.intrinsics.i1_ty.const_int(1, false).into(),
1438            ],
1439            "is_aligned_expect",
1440        ))
1441        .try_as_basic_value()
1442        .left()
1443        .unwrap()
1444        .into_int_value();
1445
1446        let continue_block = self
1447            .context
1448            .append_basic_block(self.function, "aligned_access_continue_block");
1449        let not_aligned_block = self
1450            .context
1451            .append_basic_block(self.function, "misaligned_trap_block");
1452        err!(
1453            self.builder
1454                .build_conditional_branch(aligned, continue_block, not_aligned_block)
1455        );
1456
1457        self.builder.position_at_end(not_aligned_block);
1458        err!(self.builder.build_call(
1459            self.intrinsics.throw_trap,
1460            &[self.intrinsics.trap_unaligned_atomic.into()],
1461            "throw",
1462        ));
1463        err!(self.builder.build_unreachable());
1464
1465        self.builder.position_at_end(continue_block);
1466        Ok(())
1467    }
1468
1469    fn finalize(&mut self, wasm_fn_type: &FunctionType) -> Result<(), CompileError> {
1470        let func_type = self.function.get_type();
1471
1472        let results = self.state.popn_save_extra(wasm_fn_type.results().len())?;
1473        let results = err!(
1474            results
1475                .into_iter()
1476                .map(|(v, i)| self.apply_pending_canonicalization(v, i))
1477                .collect::<Result<Vec<_>, _>>()
1478        );
1479
1480        if wasm_fn_type.results().is_empty() {
1481            err!(self.builder.build_return(None));
1482        } else if self.abi.is_sret(wasm_fn_type)? {
1483            let sret = self
1484                .function
1485                .get_first_param()
1486                .unwrap()
1487                .into_pointer_value();
1488            let llvm_params: Vec<_> = wasm_fn_type
1489                .results()
1490                .iter()
1491                .map(|x| type_to_llvm(self.intrinsics, *x).unwrap())
1492                .collect();
1493            let mut struct_value = self
1494                .context
1495                .struct_type(llvm_params.as_slice(), false)
1496                .get_undef();
1497            for (idx, value) in results.into_iter().enumerate() {
1498                let value = err!(self.builder.build_bit_cast(
1499                    value,
1500                    type_to_llvm(self.intrinsics, wasm_fn_type.results()[idx])?,
1501                    "",
1502                ));
1503                struct_value =
1504                    err!(
1505                        self.builder
1506                            .build_insert_value(struct_value, value, idx as u32, "")
1507                    )
1508                    .into_struct_value();
1509            }
1510            err!(self.builder.build_store(sret, struct_value));
1511            err!(self.builder.build_return(None));
1512        } else {
1513            err!(
1514                self.builder
1515                    .build_return(Some(&self.abi.pack_values_for_register_return(
1516                        self.intrinsics,
1517                        &self.builder,
1518                        &results,
1519                        &func_type,
1520                    )?))
1521            );
1522        }
1523        Ok(())
1524    }
1525
1526    fn get_or_insert_tag_type_info_global(&mut self, tag: i32) -> BasicValueEnum<'ctx> {
1529        if let Some(tag) = self.tags_cache.get(&tag) {
1530            return *tag;
1531        }
1532
1533        let tag_ty = self
1534            .context
1535            .struct_type(&[self.intrinsics.i32_ty.into()], false);
1536        let tag_glbl = self.module.add_global(
1537            tag_ty,
1538            Some(AddressSpace::default()),
1539            &format!("__wasmer_eh_type_info_{tag}"),
1540        );
1541        tag_glbl.set_initializer(
1542            &tag_ty
1543                .const_named_struct(&[self.intrinsics.i32_ty.const_int(tag as _, false).into()])
1544                .as_basic_value_enum(),
1545        );
1546
1547        tag_glbl.set_linkage(Linkage::External);
1548        tag_glbl.set_constant(true);
1549        if matches!(self.binary_fmt, target_lexicon::BinaryFormat::Macho) {
1557            tag_glbl.set_section(Some(&format!("{FUNCTION_SECTION_MACHO},_eh_ti_{tag}")));
1558        }
1559
1560        let tag_glbl = tag_glbl.as_basic_value_enum();
1561
1562        self.tags_cache.insert(tag, tag_glbl);
1563        tag_glbl
1564    }
1565
1566    fn build_g0m0_indirect_call(
1567        &mut self,
1568        table_index: u32,
1569        ctx_ptr: PointerValue<'ctx>,
1570        func_type: &FunctionType,
1571        func_ptr: PointerValue<'ctx>,
1572        func_index: IntValue<'ctx>,
1573    ) -> Result<(), CompileError> {
1574        let Some((g0, m0)) = self.g0m0 else {
1575            return Err(CompileError::Codegen(
1576                "Call to build_g0m0_indirect_call without g0m0 parameters!".to_string(),
1577            ));
1578        };
1579
1580        let mut local_func_indices = vec![];
1581        let mut foreign_func_indices = vec![];
1582
1583        for t in &self.wasm_module.table_initializers {
1584            if t.table_index.as_u32() == table_index {
1585                for (func_in_table_idx, func_idx) in t.elements.iter().enumerate() {
1586                    if self.wasm_module.local_func_index(*func_idx).is_some() {
1587                        local_func_indices.push(func_in_table_idx)
1588                    } else {
1589                        foreign_func_indices.push(func_in_table_idx)
1590                    }
1591                }
1592                break;
1593            }
1594        }
1595
1596        let g0_value = err!(self.builder.build_load(self.intrinsics.i32_ty, g0, "g0"));
1599
1600        let needs_switch = self.g0m0.is_some()
1601            && !local_func_indices.is_empty()
1602            && !foreign_func_indices.is_empty();
1603
1604        if needs_switch {
1605            let foreign_idx_block = self
1606                .context
1607                .append_basic_block(self.function, "foreign_call_block");
1608            let local_idx_block = self
1609                .context
1610                .append_basic_block(self.function, "local_call_block");
1611            let unreachable_indirect_call_branch_block = self
1612                .context
1613                .append_basic_block(self.function, "unreachable_indirect_call_branch");
1614
1615            let cont = self.context.append_basic_block(self.function, "cont");
1616
1617            err!(
1618                self.builder.build_switch(
1619                    func_index,
1620                    unreachable_indirect_call_branch_block,
1621                    &local_func_indices
1622                        .into_iter()
1623                        .map(|v| (
1624                            self.intrinsics.i32_ty.const_int(v as _, false),
1625                            local_idx_block
1626                        ))
1627                        .chain(foreign_func_indices.into_iter().map(|v| (
1628                            self.intrinsics.i32_ty.const_int(v as _, false),
1629                            foreign_idx_block
1630                        )))
1631                        .collect::<Vec<_>>()
1632                )
1633            );
1634
1635            self.builder
1636                .position_at_end(unreachable_indirect_call_branch_block);
1637            err!(self.builder.build_unreachable());
1638
1639            self.builder.position_at_end(local_idx_block);
1641            let local_call_site = self.build_indirect_call(
1642                ctx_ptr,
1643                func_type,
1644                func_ptr,
1645                Some(G0M0FunctionKind::Local),
1646                Some((g0_value.into_int_value(), m0)),
1647            )?;
1648
1649            let local_rets = self.abi.rets_from_call(
1650                &self.builder,
1651                self.intrinsics,
1652                local_call_site,
1653                func_type,
1654            )?;
1655
1656            err!(self.builder.build_unconditional_branch(cont));
1657
1658            self.builder.position_at_end(foreign_idx_block);
1659            let foreign_call_site = self.build_indirect_call(
1660                ctx_ptr,
1661                func_type,
1662                func_ptr,
1663                Some(G0M0FunctionKind::Imported),
1664                None,
1665            )?;
1666
1667            let foreign_rets = self.abi.rets_from_call(
1668                &self.builder,
1669                self.intrinsics,
1670                foreign_call_site,
1671                func_type,
1672            )?;
1673
1674            err!(self.builder.build_unconditional_branch(cont));
1675
1676            self.builder.position_at_end(cont);
1677
1678            for i in 0..foreign_rets.len() {
1679                let f_i = foreign_rets[i];
1680                let l_i = local_rets[i];
1681                let ty = f_i.get_type();
1682                let v = err!(self.builder.build_phi(ty, ""));
1683                v.add_incoming(&[(&f_i, foreign_idx_block), (&l_i, local_idx_block)]);
1684                self.state.push1(v.as_basic_value());
1685            }
1686        } else if foreign_func_indices.is_empty() {
1687            let call_site = self.build_indirect_call(
1688                ctx_ptr,
1689                func_type,
1690                func_ptr,
1691                Some(G0M0FunctionKind::Local),
1692                Some((g0_value.into_int_value(), m0)),
1693            )?;
1694
1695            self.abi
1696                .rets_from_call(&self.builder, self.intrinsics, call_site, func_type)?
1697                .iter()
1698                .for_each(|ret| self.state.push1(*ret));
1699        } else {
1700            let call_site = self.build_indirect_call(
1701                ctx_ptr,
1702                func_type,
1703                func_ptr,
1704                Some(G0M0FunctionKind::Imported),
1705                Some((g0_value.into_int_value(), m0)),
1706            )?;
1707            self.abi
1708                .rets_from_call(&self.builder, self.intrinsics, call_site, func_type)?
1709                .iter()
1710                .for_each(|ret| self.state.push1(*ret));
1711        }
1712
1713        Ok(())
1714    }
1715
1716    fn build_indirect_call(
1717        &mut self,
1718        ctx_ptr: PointerValue<'ctx>,
1719        func_type: &FunctionType,
1720        func_ptr: PointerValue<'ctx>,
1721        func_kind: Option<G0M0FunctionKind>,
1722        g0m0_params: LocalFunctionG0M0params<'ctx>,
1723    ) -> Result<CallSiteValue<'ctx>, CompileError> {
1724        let (llvm_func_type, llvm_func_attrs) = self.abi.func_type_to_llvm(
1725            self.context,
1726            self.intrinsics,
1727            Some(self.ctx.get_offsets()),
1728            func_type,
1729            func_kind,
1730        )?;
1731
1732        let params = self.state.popn_save_extra(func_type.params().len())?;
1733
1734        let params = params
1736            .iter()
1737            .zip(func_type.params().iter())
1738            .map(|((v, info), wasm_ty)| match wasm_ty {
1739                Type::F32 => err_nt!(self.builder.build_bit_cast(
1740                    self.apply_pending_canonicalization(*v, *info)?,
1741                    self.intrinsics.f32_ty,
1742                    "",
1743                )),
1744                Type::F64 => err_nt!(self.builder.build_bit_cast(
1745                    self.apply_pending_canonicalization(*v, *info)?,
1746                    self.intrinsics.f64_ty,
1747                    "",
1748                )),
1749                Type::V128 => self.apply_pending_canonicalization(*v, *info),
1750                _ => Ok(*v),
1751            })
1752            .collect::<Result<Vec<_>, _>>()?;
1753
1754        let params = self.abi.args_to_call(
1755            &self.alloca_builder,
1756            func_type,
1757            &llvm_func_type,
1758            ctx_ptr,
1759            params.as_slice(),
1760            self.intrinsics,
1761            g0m0_params,
1762        )?;
1763
1764        let typed_func_ptr = err!(self.builder.build_pointer_cast(
1765            func_ptr,
1766            self.context.ptr_type(AddressSpace::default()),
1767            "typed_func_ptr",
1768        ));
1769
1770        let call_site_local = if let Some(lpad) = self.state.get_innermost_landingpad() {
1791            let then_block = self.context.append_basic_block(self.function, "then_block");
1792
1793            let ret = err!(self.builder.build_indirect_invoke(
1794                llvm_func_type,
1795                typed_func_ptr,
1796                params.as_slice(),
1797                then_block,
1798                lpad,
1799                "",
1800            ));
1801
1802            self.builder.position_at_end(then_block);
1803            ret
1804        } else {
1805            err!(
1806                self.builder.build_indirect_call(
1807                    llvm_func_type,
1808                    typed_func_ptr,
1809                    params
1810                        .iter()
1811                        .copied()
1812                        .map(Into::into)
1813                        .collect::<Vec<BasicMetadataValueEnum>>()
1814                        .as_slice(),
1815                    "indirect_call",
1816                )
1817            )
1818        };
1819        for (attr, attr_loc) in llvm_func_attrs {
1820            call_site_local.add_attribute(attr_loc, attr);
1821        }
1822
1823        Ok(call_site_local)
1824    }
1825}
1826
1827pub struct LLVMFunctionCodeGenerator<'ctx, 'a> {
1913    g0m0: Option<(PointerValue<'ctx>, PointerValue<'ctx>)>,
1914    context: &'ctx Context,
1915    builder: Builder<'ctx>,
1916    alloca_builder: Builder<'ctx>,
1917    intrinsics: &'a Intrinsics<'ctx>,
1918    state: State<'ctx>,
1919    function: FunctionValue<'ctx>,
1920    locals: Vec<(BasicTypeEnum<'ctx>, PointerValue<'ctx>)>, ctx: CtxType<'ctx, 'a>,
1922    unreachable_depth: usize,
1923    memory_styles: &'a PrimaryMap<MemoryIndex, MemoryStyle>,
1924    _table_styles: &'a PrimaryMap<TableIndex, TableStyle>,
1925
1926    module: &'a Module<'ctx>,
1934    module_translation: &'a ModuleTranslationState,
1935    wasm_module: &'a ModuleInfo,
1936    symbol_registry: &'a dyn SymbolRegistry,
1937    abi: &'a dyn Abi,
1938    config: &'a LLVM,
1939    tags_cache: HashMap<i32, BasicValueEnum<'ctx>>,
1940    binary_fmt: target_lexicon::BinaryFormat,
1941}
1942
1943impl<'ctx> LLVMFunctionCodeGenerator<'ctx, '_> {
1944    fn translate_operator(&mut self, op: Operator, _source_loc: u32) -> Result<(), CompileError> {
1945        let vmctx = &self.ctx.basic().into_pointer_value();
1948
1949        if !self.state.reachable {
1952            match op {
1953                Operator::Block { blockty: _ }
1954                | Operator::Loop { blockty: _ }
1955                | Operator::If { blockty: _ } => {
1956                    self.unreachable_depth += 1;
1957                    return Ok(());
1958                }
1959                Operator::Else => {
1960                    if self.unreachable_depth != 0 {
1961                        return Ok(());
1962                    }
1963                }
1964                Operator::End => {
1965                    if self.unreachable_depth != 0 {
1966                        self.unreachable_depth -= 1;
1967                        return Ok(());
1968                    }
1969                }
1970                _ => {
1971                    return Ok(());
1972                }
1973            }
1974        }
1975
1976        match op {
1977            Operator::Block { blockty } => {
1982                let current_block = self
1983                    .builder
1984                    .get_insert_block()
1985                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
1986
1987                let end_block = self.context.append_basic_block(self.function, "end");
1988                self.builder.position_at_end(end_block);
1989
1990                let phis: SmallVec<[PhiValue<'ctx>; 1]> = self
1991                    .module_translation
1992                    .blocktype_params_results(&blockty)?
1993                    .1
1994                    .iter()
1995                    .map(|&wp_ty| {
1996                        err_nt!(wptype_to_type(wp_ty)).and_then(|wasm_ty| {
1997                            type_to_llvm(self.intrinsics, wasm_ty)
1998                                .and_then(|ty| err_nt!(self.builder.build_phi(ty, "")))
1999                        })
2000                    })
2001                    .collect::<Result<_, _>>()?;
2002
2003                self.state.push_block(
2004                    end_block,
2005                    phis,
2006                    self.module_translation
2007                        .blocktype_params_results(&blockty)?
2008                        .0
2009                        .len(),
2010                );
2011                self.builder.position_at_end(current_block);
2012            }
2013            Operator::Loop { blockty } => {
2014                let loop_body = self.context.append_basic_block(self.function, "loop_body");
2015                let loop_next = self.context.append_basic_block(self.function, "loop_outer");
2016                let pre_loop_block = self.builder.get_insert_block().unwrap();
2017
2018                err!(self.builder.build_unconditional_branch(loop_body));
2019
2020                self.builder.position_at_end(loop_next);
2021                let blocktypes = self.module_translation.blocktype_params_results(&blockty)?;
2022                let phis = blocktypes
2023                    .1
2024                    .iter()
2025                    .map(|&wp_ty| {
2026                        err_nt!(wptype_to_type(wp_ty)).and_then(|wasm_ty| {
2027                            type_to_llvm(self.intrinsics, wasm_ty)
2028                                .and_then(|ty| err_nt!(self.builder.build_phi(ty, "")))
2029                        })
2030                    })
2031                    .collect::<Result<_, _>>()?;
2032                self.builder.position_at_end(loop_body);
2033                let loop_phis: SmallVec<[PhiValue<'ctx>; 1]> = blocktypes
2034                    .0
2035                    .iter()
2036                    .map(|&wp_ty| {
2037                        err_nt!(wptype_to_type(wp_ty)).and_then(|wasm_ty| {
2038                            type_to_llvm(self.intrinsics, wasm_ty)
2039                                .and_then(|ty| err_nt!(self.builder.build_phi(ty, "")))
2040                        })
2041                    })
2042                    .collect::<Result<_, _>>()?;
2043                for phi in loop_phis.iter().rev() {
2044                    let (value, info) = self.state.pop1_extra()?;
2045                    let value = self.apply_pending_canonicalization(value, info)?;
2046                    phi.add_incoming(&[(&value, pre_loop_block)]);
2047                }
2048                for phi in &loop_phis {
2049                    self.state.push1(phi.as_basic_value());
2050                }
2051
2052                let num_inputs = loop_phis.len();
2053                self.state
2054                    .push_loop(loop_body, loop_next, loop_phis, phis, num_inputs);
2055            }
2056            Operator::Br { relative_depth } => {
2057                let frame = self.state.frame_at_depth(relative_depth)?;
2058
2059                let current_block = self
2060                    .builder
2061                    .get_insert_block()
2062                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
2063
2064                let phis = if frame.is_loop() {
2065                    frame.loop_body_phis()
2066                } else {
2067                    frame.phis()
2068                };
2069
2070                let len = phis.len();
2071                let values = self.state.peekn_extra(len)?;
2072                let values = values
2073                    .iter()
2074                    .map(|(v, info)| self.apply_pending_canonicalization(*v, *info))
2075                    .collect::<Result<Vec<_>, _>>()?;
2076
2077                for (phi, value) in phis.iter().zip(values.into_iter()) {
2081                    phi.add_incoming(&[(&value, current_block)]);
2082                }
2083
2084                err!(self.builder.build_unconditional_branch(*frame.br_dest()));
2085
2086                self.state.popn(len)?;
2087                self.state.reachable = false;
2088            }
2089            Operator::BrIf { relative_depth } => {
2090                let cond = self.state.pop1()?;
2091                let frame = self.state.frame_at_depth(relative_depth)?;
2092
2093                let current_block = self
2094                    .builder
2095                    .get_insert_block()
2096                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
2097
2098                let phis = if frame.is_loop() {
2099                    frame.loop_body_phis()
2100                } else {
2101                    frame.phis()
2102                };
2103
2104                let param_stack = self.state.peekn_extra(phis.len())?;
2105                let param_stack = param_stack
2106                    .iter()
2107                    .map(|(v, info)| self.apply_pending_canonicalization(*v, *info))
2108                    .collect::<Result<Vec<_>, _>>()?;
2109
2110                for (phi, value) in phis.iter().zip(param_stack) {
2111                    phi.add_incoming(&[(&value, current_block)]);
2112                }
2113
2114                let else_block = self.context.append_basic_block(self.function, "else");
2115
2116                let cond_value = err!(self.builder.build_int_compare(
2117                    IntPredicate::NE,
2118                    cond.into_int_value(),
2119                    self.intrinsics.i32_zero,
2120                    "",
2121                ));
2122                err!(self.builder.build_conditional_branch(
2123                    cond_value,
2124                    *frame.br_dest(),
2125                    else_block
2126                ));
2127                self.builder.position_at_end(else_block);
2128            }
2129            Operator::BrTable { ref targets } => {
2130                let current_block = self
2131                    .builder
2132                    .get_insert_block()
2133                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
2134
2135                let index = self.state.pop1()?;
2136
2137                let default_frame = self.state.frame_at_depth(targets.default())?;
2138
2139                let phis = if default_frame.is_loop() {
2140                    default_frame.loop_body_phis()
2141                } else {
2142                    default_frame.phis()
2143                };
2144                let args = self.state.peekn(phis.len())?;
2145
2146                for (phi, value) in phis.iter().zip(args.iter()) {
2147                    phi.add_incoming(&[(value, current_block)]);
2148                }
2149
2150                let cases: Vec<_> = targets
2151                    .targets()
2152                    .enumerate()
2153                    .map(|(case_index, depth)| {
2154                        let depth = depth.map_err(from_binaryreadererror_wasmerror)?;
2155                        let frame_result: Result<&ControlFrame, CompileError> =
2156                            self.state.frame_at_depth(depth);
2157                        let frame = match frame_result {
2158                            Ok(v) => v,
2159                            Err(e) => return Err(e),
2160                        };
2161                        let case_index_literal =
2162                            self.context.i32_type().const_int(case_index as u64, false);
2163                        let phis = if frame.is_loop() {
2164                            frame.loop_body_phis()
2165                        } else {
2166                            frame.phis()
2167                        };
2168                        for (phi, value) in phis.iter().zip(args.iter()) {
2169                            phi.add_incoming(&[(value, current_block)]);
2170                        }
2171
2172                        Ok((case_index_literal, *frame.br_dest()))
2173                    })
2174                    .collect::<Result<_, _>>()?;
2175
2176                err!(self.builder.build_switch(
2177                    index.into_int_value(),
2178                    *default_frame.br_dest(),
2179                    &cases[..],
2180                ));
2181
2182                let args_len = args.len();
2183                self.state.popn(args_len)?;
2184                self.state.reachable = false;
2185            }
2186            Operator::If { blockty } => {
2187                let current_block = self
2188                    .builder
2189                    .get_insert_block()
2190                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
2191                let if_then_block = self.context.append_basic_block(self.function, "if_then");
2192                let if_else_block = self.context.append_basic_block(self.function, "if_else");
2193                let end_block = self.context.append_basic_block(self.function, "if_end");
2194
2195                let end_phis = {
2196                    self.builder.position_at_end(end_block);
2197
2198                    let phis = self
2199                        .module_translation
2200                        .blocktype_params_results(&blockty)?
2201                        .1
2202                        .iter()
2203                        .map(|&wp_ty| {
2204                            err_nt!(wptype_to_type(wp_ty)).and_then(|wasm_ty| {
2205                                type_to_llvm(self.intrinsics, wasm_ty)
2206                                    .and_then(|ty| err_nt!(self.builder.build_phi(ty, "")))
2207                            })
2208                        })
2209                        .collect::<Result<_, _>>()?;
2210
2211                    self.builder.position_at_end(current_block);
2212                    phis
2213                };
2214
2215                let cond = self.state.pop1()?;
2216
2217                let cond_value = err!(self.builder.build_int_compare(
2218                    IntPredicate::NE,
2219                    cond.into_int_value(),
2220                    self.intrinsics.i32_zero,
2221                    "",
2222                ));
2223
2224                err!(self.builder.build_conditional_branch(
2225                    cond_value,
2226                    if_then_block,
2227                    if_else_block
2228                ));
2229                self.builder.position_at_end(if_else_block);
2230                let block_param_types = self
2231                    .module_translation
2232                    .blocktype_params_results(&blockty)?
2233                    .0
2234                    .iter()
2235                    .map(|&wp_ty| {
2236                        err_nt!(wptype_to_type(wp_ty))
2237                            .and_then(|wasm_ty| type_to_llvm(self.intrinsics, wasm_ty))
2238                    })
2239                    .collect::<Result<Vec<_>, _>>()?;
2240                let else_phis: SmallVec<[PhiValue<'ctx>; 1]> = block_param_types
2241                    .iter()
2242                    .map(|&ty| err_nt!(self.builder.build_phi(ty, "")))
2243                    .collect::<Result<SmallVec<_>, _>>()?;
2244                self.builder.position_at_end(if_then_block);
2245                let then_phis: SmallVec<[PhiValue<'ctx>; 1]> = block_param_types
2246                    .iter()
2247                    .map(|&ty| err_nt!(self.builder.build_phi(ty, "")))
2248                    .collect::<Result<SmallVec<_>, _>>()?;
2249                for (else_phi, then_phi) in else_phis.iter().rev().zip(then_phis.iter().rev()) {
2250                    let (value, info) = self.state.pop1_extra()?;
2251                    let value = self.apply_pending_canonicalization(value, info)?;
2252                    else_phi.add_incoming(&[(&value, current_block)]);
2253                    then_phi.add_incoming(&[(&value, current_block)]);
2254                }
2255                for phi in then_phis.iter() {
2256                    self.state.push1(phi.as_basic_value());
2257                }
2258
2259                self.state.push_if(
2260                    if_then_block,
2261                    if_else_block,
2262                    end_block,
2263                    then_phis,
2264                    else_phis,
2265                    end_phis,
2266                    block_param_types.len(),
2267                );
2268            }
2269            Operator::Else => {
2270                if self.state.reachable {
2271                    let frame = self.state.frame_at_depth(0)?;
2272                    let current_block = self.builder.get_insert_block().ok_or_else(|| {
2273                        CompileError::Codegen("not currently in a block".to_string())
2274                    })?;
2275
2276                    for phi in frame.phis().to_vec().iter().rev() {
2277                        let (value, info) = self.state.pop1_extra()?;
2278                        let value = self.apply_pending_canonicalization(value, info)?;
2279                        phi.add_incoming(&[(&value, current_block)])
2280                    }
2281
2282                    let frame = self.state.frame_at_depth(0)?;
2283                    err!(self.builder.build_unconditional_branch(*frame.code_after()));
2284                }
2285
2286                let (if_else_block, if_else_state) = if let ControlFrame::IfElse {
2287                    if_else,
2288                    if_else_state,
2289                    ..
2290                } = self.state.frame_at_depth_mut(0)?
2291                {
2292                    (if_else, if_else_state)
2293                } else {
2294                    unreachable!()
2295                };
2296
2297                *if_else_state = IfElseState::Else;
2298
2299                self.builder.position_at_end(*if_else_block);
2300                self.state.reachable = true;
2301
2302                if let ControlFrame::IfElse { else_phis, .. } = self.state.frame_at_depth(0)? {
2303                    for phi in else_phis.clone().iter() {
2305                        self.state.push1(phi.as_basic_value());
2306                    }
2307                };
2308            }
2309
2310            Operator::End => {
2311                let frame = self.state.pop_frame()?;
2312                let current_block = self
2313                    .builder
2314                    .get_insert_block()
2315                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
2316
2317                if self.state.reachable {
2318                    for phi in frame.phis().iter().rev() {
2319                        let (value, info) = self.state.pop1_extra()?;
2320                        let value = self.apply_pending_canonicalization(value, info)?;
2321                        phi.add_incoming(&[(&value, current_block)]);
2322                    }
2323
2324                    err!(self.builder.build_unconditional_branch(*frame.code_after()));
2325                }
2326
2327                if let ControlFrame::IfElse {
2328                    if_else,
2329                    next,
2330                    if_else_state: IfElseState::If,
2331                    else_phis,
2332                    ..
2333                } = &frame
2334                {
2335                    for (phi, else_phi) in frame.phis().iter().zip(else_phis.iter()) {
2336                        phi.add_incoming(&[(&else_phi.as_basic_value(), *if_else)]);
2337                    }
2338                    self.builder.position_at_end(*if_else);
2339                    err!(self.builder.build_unconditional_branch(*next));
2340                } else if let ControlFrame::Landingpad { .. } = &frame {
2341                    self.state.pop_landingpad();
2342                };
2343
2344                self.builder.position_at_end(*frame.code_after());
2345                self.state.reset_stack(&frame);
2346
2347                self.state.reachable = true;
2348
2349                for phi in frame.phis() {
2351                    if phi.count_incoming() != 0 {
2352                        self.state.push1(phi.as_basic_value());
2353                    } else {
2354                        let basic_ty = phi.as_basic_value().get_type();
2361                        let placeholder_value = basic_ty.const_zero();
2362                        self.state.push1(placeholder_value);
2363                        phi.as_instruction().erase_from_basic_block();
2364                    }
2365                }
2366            }
2367            Operator::Return => {
2368                let current_block = self
2369                    .builder
2370                    .get_insert_block()
2371                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
2372
2373                let frame = self.state.outermost_frame()?;
2374                for phi in frame.phis().to_vec().iter().rev() {
2375                    let (arg, info) = self.state.pop1_extra()?;
2376                    let arg = self.apply_pending_canonicalization(arg, info)?;
2377                    phi.add_incoming(&[(&arg, current_block)]);
2378                }
2379                let frame = self.state.outermost_frame()?;
2380                err!(self.builder.build_unconditional_branch(*frame.br_dest()));
2381
2382                self.state.reachable = false;
2383            }
2384
2385            Operator::Unreachable => {
2386                err!(self.builder.build_call(
2387                    self.intrinsics.throw_trap,
2388                    &[self.intrinsics.trap_unreachable.into()],
2389                    "throw",
2390                ));
2391                err!(self.builder.build_unreachable());
2392
2393                self.state.reachable = false;
2394            }
2395
2396            Operator::Nop => {
2401                }
2403            Operator::Drop => {
2404                self.state.pop1()?;
2405            }
2406
2407            Operator::I32Const { value } => {
2409                let i = self.intrinsics.i32_ty.const_int(value as u64, false);
2410                let info = if is_f32_arithmetic(value as u32) {
2411                    ExtraInfo::arithmetic_f32()
2412                } else {
2413                    Default::default()
2414                };
2415                self.state.push1_extra(i, info);
2416            }
2417            Operator::I64Const { value } => {
2418                let i = self.intrinsics.i64_ty.const_int(value as u64, false);
2419                let info = if is_f64_arithmetic(value as u64) {
2420                    ExtraInfo::arithmetic_f64()
2421                } else {
2422                    Default::default()
2423                };
2424                self.state.push1_extra(i, info);
2425            }
2426            Operator::F32Const { value } => {
2427                let bits = self.intrinsics.i32_ty.const_int(value.bits() as u64, false);
2428                let info = if is_f32_arithmetic(value.bits()) {
2429                    ExtraInfo::arithmetic_f32()
2430                } else {
2431                    Default::default()
2432                };
2433                let f = err!(
2434                    self.builder
2435                        .build_bit_cast(bits, self.intrinsics.f32_ty, "f")
2436                );
2437                self.state.push1_extra(f, info);
2438            }
2439            Operator::F64Const { value } => {
2440                let bits = self.intrinsics.i64_ty.const_int(value.bits(), false);
2441                let info = if is_f64_arithmetic(value.bits()) {
2442                    ExtraInfo::arithmetic_f64()
2443                } else {
2444                    Default::default()
2445                };
2446                let f = err!(
2447                    self.builder
2448                        .build_bit_cast(bits, self.intrinsics.f64_ty, "f")
2449                );
2450                self.state.push1_extra(f, info);
2451            }
2452            Operator::V128Const { value } => {
2453                let mut hi: [u8; 8] = Default::default();
2454                let mut lo: [u8; 8] = Default::default();
2455                hi.copy_from_slice(&value.bytes()[0..8]);
2456                lo.copy_from_slice(&value.bytes()[8..16]);
2457                let packed = [u64::from_le_bytes(hi), u64::from_le_bytes(lo)];
2458                let i = self
2459                    .intrinsics
2460                    .i128_ty
2461                    .const_int_arbitrary_precision(&packed);
2462                let mut quad1: [u8; 4] = Default::default();
2463                let mut quad2: [u8; 4] = Default::default();
2464                let mut quad3: [u8; 4] = Default::default();
2465                let mut quad4: [u8; 4] = Default::default();
2466                quad1.copy_from_slice(&value.bytes()[0..4]);
2467                quad2.copy_from_slice(&value.bytes()[4..8]);
2468                quad3.copy_from_slice(&value.bytes()[8..12]);
2469                quad4.copy_from_slice(&value.bytes()[12..16]);
2470                let mut info: ExtraInfo = Default::default();
2471                if is_f32_arithmetic(u32::from_le_bytes(quad1))
2472                    && is_f32_arithmetic(u32::from_le_bytes(quad2))
2473                    && is_f32_arithmetic(u32::from_le_bytes(quad3))
2474                    && is_f32_arithmetic(u32::from_le_bytes(quad4))
2475                {
2476                    info |= ExtraInfo::arithmetic_f32();
2477                }
2478                if is_f64_arithmetic(packed[0]) && is_f64_arithmetic(packed[1]) {
2479                    info |= ExtraInfo::arithmetic_f64();
2480                }
2481                self.state.push1_extra(i, info);
2482            }
2483
2484            Operator::I8x16Splat => {
2485                let (v, i) = self.state.pop1_extra()?;
2486                let v = v.into_int_value();
2487                let v = err!(
2488                    self.builder
2489                        .build_int_truncate(v, self.intrinsics.i8_ty, "")
2490                );
2491                let res = self.splat_vector(v.as_basic_value_enum(), self.intrinsics.i8x16_ty)?;
2492                let res = err!(
2493                    self.builder
2494                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
2495                );
2496                self.state.push1_extra(res, i);
2497            }
2498            Operator::I16x8Splat => {
2499                let (v, i) = self.state.pop1_extra()?;
2500                let v = v.into_int_value();
2501                let v = err!(
2502                    self.builder
2503                        .build_int_truncate(v, self.intrinsics.i16_ty, "")
2504                );
2505                let res = self.splat_vector(v.as_basic_value_enum(), self.intrinsics.i16x8_ty)?;
2506                let res = err!(
2507                    self.builder
2508                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
2509                );
2510                self.state.push1_extra(res, i);
2511            }
2512            Operator::I32x4Splat => {
2513                let (v, i) = self.state.pop1_extra()?;
2514                let res = self.splat_vector(v, self.intrinsics.i32x4_ty)?;
2515                let res = err!(
2516                    self.builder
2517                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
2518                );
2519                self.state.push1_extra(res, i);
2520            }
2521            Operator::I64x2Splat => {
2522                let (v, i) = self.state.pop1_extra()?;
2523                let res = self.splat_vector(v, self.intrinsics.i64x2_ty)?;
2524                let res = err!(
2525                    self.builder
2526                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
2527                );
2528                self.state.push1_extra(res, i);
2529            }
2530            Operator::F32x4Splat => {
2531                let (v, i) = self.state.pop1_extra()?;
2532                let res = self.splat_vector(v, self.intrinsics.f32x4_ty)?;
2533                let res = err!(
2534                    self.builder
2535                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
2536                );
2537                self.state.push1_extra(res, i);
2540            }
2541            Operator::F64x2Splat => {
2542                let (v, i) = self.state.pop1_extra()?;
2543                let res = self.splat_vector(v, self.intrinsics.f64x2_ty)?;
2544                let res = err!(
2545                    self.builder
2546                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
2547                );
2548                self.state.push1_extra(res, i);
2551            }
2552
2553            Operator::LocalGet { local_index } => {
2555                let (type_value, pointer_value) = self.locals[local_index as usize];
2556                let v = err!(self.builder.build_load(
2557                    type_value,
2558                    pointer_value,
2559                    &format!("local_{local_index}_get")
2560                ));
2561                tbaa_label(
2562                    self.module,
2563                    self.intrinsics,
2564                    format!("local {local_index}"),
2565                    v.as_instruction_value().unwrap(),
2566                );
2567                self.state.push1(v);
2568            }
2569            Operator::LocalSet { local_index } => {
2570                let pointer_value = self.locals[local_index as usize].1;
2571                let (v, i) = self.state.pop1_extra()?;
2572                let v = self.apply_pending_canonicalization(v, i)?;
2573                let store = err!(self.builder.build_store(pointer_value, v));
2574                tbaa_label(
2575                    self.module,
2576                    self.intrinsics,
2577                    format!("local {local_index}"),
2578                    store,
2579                );
2580            }
2581            Operator::LocalTee { local_index } => {
2582                let pointer_value = self.locals[local_index as usize].1;
2583                let (v, i) = self.state.peek1_extra()?;
2584                let v = self.apply_pending_canonicalization(v, i)?;
2585                let store = err!(self.builder.build_store(pointer_value, v));
2586                tbaa_label(
2587                    self.module,
2588                    self.intrinsics,
2589                    format!("local {local_index}"),
2590                    store,
2591                );
2592            }
2593
2594            Operator::GlobalGet { global_index } => {
2595                if self.g0m0.is_some() && global_index == 0 {
2596                    let Some((g0, _)) = self.g0m0 else {
2597                        unreachable!()
2598                    };
2599
2600                    let value = err!(self.builder.build_load(self.intrinsics.i32_ty, g0, ""));
2602
2603                    self.state.push1(value);
2604                } else {
2605                    let global_index = GlobalIndex::from_u32(global_index);
2606                    match self
2607                        .ctx
2608                        .global(global_index, self.intrinsics, self.module)?
2609                    {
2610                        GlobalCache::Const { value } => {
2611                            self.state.push1(*value);
2612                        }
2613                        GlobalCache::Mut {
2614                            ptr_to_value,
2615                            value_type,
2616                        } => {
2617                            let value =
2618                                err!(self.builder.build_load(*value_type, *ptr_to_value, ""));
2619                            tbaa_label(
2620                                self.module,
2621                                self.intrinsics,
2622                                format!("global {}", global_index.as_u32()),
2623                                value.as_instruction_value().unwrap(),
2624                            );
2625                            self.state.push1(value);
2626                        }
2627                    }
2628                }
2629            }
2630            Operator::GlobalSet { global_index } => {
2631                if self.g0m0.is_some() && global_index == 0 {
2632                    let Some((g0, _)) = self.g0m0 else {
2633                        unreachable!()
2634                    };
2635                    let ptr_to_value = g0;
2636                    let (value, info) = self.state.pop1_extra()?;
2637                    let value = self.apply_pending_canonicalization(value, info)?;
2638                    let store = err!(self.builder.build_store(ptr_to_value, value));
2639                    tbaa_label(self.module, self.intrinsics, "global 0".to_string(), store);
2640                } else {
2641                    let global_index = GlobalIndex::from_u32(global_index);
2642                    match self
2643                        .ctx
2644                        .global(global_index, self.intrinsics, self.module)?
2645                    {
2646                        GlobalCache::Const { value: _ } => {
2647                            return Err(CompileError::Codegen(format!(
2648                                "global.set on immutable global index {}",
2649                                global_index.as_u32()
2650                            )));
2651                        }
2652                        GlobalCache::Mut { ptr_to_value, .. } => {
2653                            let ptr_to_value = *ptr_to_value;
2654                            let (value, info) = self.state.pop1_extra()?;
2655                            let value = self.apply_pending_canonicalization(value, info)?;
2656                            let store = err!(self.builder.build_store(ptr_to_value, value));
2657                            tbaa_label(
2658                                self.module,
2659                                self.intrinsics,
2660                                format!("global {}", global_index.as_u32()),
2661                                store,
2662                            );
2663                        }
2664                    }
2665                }
2666            }
2667
2668            Operator::TypedSelect { .. } | Operator::Select => {
2671                let ((v1, i1), (v2, i2), (cond, _)) = self.state.pop3_extra()?;
2672                let (v1, i1, v2, i2) = if i1.has_pending_f32_nan() != i2.has_pending_f32_nan()
2680                    || i1.has_pending_f64_nan() != i2.has_pending_f64_nan()
2681                {
2682                    (
2683                        self.apply_pending_canonicalization(v1, i1)?,
2684                        i1.strip_pending(),
2685                        self.apply_pending_canonicalization(v2, i2)?,
2686                        i2.strip_pending(),
2687                    )
2688                } else {
2689                    (v1, i1, v2, i2)
2690                };
2691                let cond_value = err!(self.builder.build_int_compare(
2692                    IntPredicate::NE,
2693                    cond.into_int_value(),
2694                    self.intrinsics.i32_zero,
2695                    "",
2696                ));
2697                let res = err!(self.builder.build_select(cond_value, v1, v2, ""));
2698                let info = {
2699                    let mut info = (i1.strip_pending() & i2.strip_pending())?;
2700                    if i1.has_pending_f32_nan() {
2701                        debug_assert!(i2.has_pending_f32_nan());
2702                        info = (info | ExtraInfo::pending_f32_nan())?;
2703                    }
2704                    if i1.has_pending_f64_nan() {
2705                        debug_assert!(i2.has_pending_f64_nan());
2706                        info = (info | ExtraInfo::pending_f64_nan())?;
2707                    }
2708                    info
2709                };
2710                self.state.push1_extra(res, info);
2711            }
2712            Operator::Call { function_index } => {
2713                let func_index = FunctionIndex::from_u32(function_index);
2714                let sigindex = &self.wasm_module.functions[func_index];
2715                let func_type = &self.wasm_module.signatures[*sigindex];
2716
2717                let mut g0m0_params = None;
2718
2719                let FunctionCache {
2720                    func,
2721                    llvm_func_type,
2722                    vmctx: callee_vmctx,
2723                    attrs,
2724                } = if let Some(local_func_index) = self.wasm_module.local_func_index(func_index) {
2725                    if let Some((g0, m0)) = &self.g0m0 {
2726                        let value = err!(self.builder.build_load(self.intrinsics.i32_ty, *g0, ""));
2728
2729                        g0m0_params = Some((value.into_int_value(), *m0));
2730                    }
2731
2732                    let function_name = self
2733                        .symbol_registry
2734                        .symbol_to_name(Symbol::LocalFunction(local_func_index));
2735
2736                    self.ctx.local_func(
2737                        local_func_index,
2738                        func_index,
2739                        self.intrinsics,
2740                        self.module,
2741                        self.context,
2742                        func_type,
2743                        &function_name,
2744                    )?
2745                } else {
2746                    self.ctx
2747                        .func(func_index, self.intrinsics, self.context, func_type)?
2748                };
2749                let llvm_func_type = *llvm_func_type;
2750                let func = *func;
2751                let callee_vmctx = *callee_vmctx;
2752                let attrs = attrs.clone();
2753
2754                let params = self.state.popn_save_extra(func_type.params().len())?;
2760
2761                let params = params
2763                    .iter()
2764                    .zip(func_type.params().iter())
2765                    .map(|((v, info), wasm_ty)| match wasm_ty {
2766                        Type::F32 => err_nt!(self.builder.build_bit_cast(
2767                            self.apply_pending_canonicalization(*v, *info)?,
2768                            self.intrinsics.f32_ty,
2769                            "",
2770                        )),
2771                        Type::F64 => err_nt!(self.builder.build_bit_cast(
2772                            self.apply_pending_canonicalization(*v, *info)?,
2773                            self.intrinsics.f64_ty,
2774                            "",
2775                        )),
2776                        Type::V128 => self.apply_pending_canonicalization(*v, *info),
2777                        _ => Ok(*v),
2778                    })
2779                    .collect::<Result<Vec<_>, _>>()?;
2780
2781                let params = self.abi.args_to_call(
2782                    &self.alloca_builder,
2783                    func_type,
2784                    &llvm_func_type,
2785                    callee_vmctx.into_pointer_value(),
2786                    params.as_slice(),
2787                    self.intrinsics,
2788                    g0m0_params,
2789                )?;
2790
2791                let call_site = if let Some(lpad) = self.state.get_innermost_landingpad() {
2811                    let then_block = self.context.append_basic_block(self.function, "then_block");
2812
2813                    let ret = err!(self.builder.build_indirect_invoke(
2814                        llvm_func_type,
2815                        func,
2816                        params.as_slice(),
2817                        then_block,
2818                        lpad,
2819                        "",
2820                    ));
2821
2822                    self.builder.position_at_end(then_block);
2823                    ret
2824                } else {
2825                    err!(
2826                        self.builder.build_indirect_call(
2827                            llvm_func_type,
2828                            func,
2829                            params
2830                                .iter()
2831                                .copied()
2832                                .map(Into::into)
2833                                .collect::<Vec<BasicMetadataValueEnum>>()
2834                                .as_slice(),
2835                            "",
2836                        )
2837                    )
2838                };
2839                for (attr, attr_loc) in attrs {
2840                    call_site.add_attribute(attr_loc, attr);
2841                }
2842                self.abi
2859                    .rets_from_call(&self.builder, self.intrinsics, call_site, func_type)?
2860                    .iter()
2861                    .for_each(|ret| self.state.push1(*ret));
2862            }
2863            Operator::CallIndirect {
2864                type_index,
2865                table_index,
2866            } => {
2867                let sigindex = SignatureIndex::from_u32(type_index);
2868                let func_type = &self.wasm_module.signatures[sigindex];
2869                let expected_dynamic_sigindex =
2870                    self.ctx
2871                        .dynamic_sigindex(sigindex, self.intrinsics, self.module)?;
2872                let (table_base, table_bound) = self.ctx.table(
2873                    TableIndex::from_u32(table_index),
2874                    self.intrinsics,
2875                    self.module,
2876                    &self.builder,
2877                )?;
2878                let func_index = self.state.pop1()?.into_int_value();
2879
2880                let truncated_table_bounds = err!(self.builder.build_int_truncate(
2881                    table_bound,
2882                    self.intrinsics.i32_ty,
2883                    "truncated_table_bounds",
2884                ));
2885
2886                let index_in_bounds = err!(self.builder.build_int_compare(
2888                    IntPredicate::ULT,
2889                    func_index,
2890                    truncated_table_bounds,
2891                    "index_in_bounds",
2892                ));
2893
2894                let index_in_bounds = err!(self.builder.build_call(
2895                    self.intrinsics.expect_i1,
2896                    &[
2897                        index_in_bounds.into(),
2898                        self.intrinsics.i1_ty.const_int(1, false).into(),
2899                    ],
2900                    "index_in_bounds_expect",
2901                ))
2902                .try_as_basic_value()
2903                .left()
2904                .unwrap()
2905                .into_int_value();
2906
2907                let in_bounds_continue_block = self
2908                    .context
2909                    .append_basic_block(self.function, "in_bounds_continue_block");
2910                let not_in_bounds_block = self
2911                    .context
2912                    .append_basic_block(self.function, "not_in_bounds_block");
2913                err!(self.builder.build_conditional_branch(
2914                    index_in_bounds,
2915                    in_bounds_continue_block,
2916                    not_in_bounds_block,
2917                ));
2918                self.builder.position_at_end(not_in_bounds_block);
2919                err!(self.builder.build_call(
2920                    self.intrinsics.throw_trap,
2921                    &[self.intrinsics.trap_table_access_oob.into()],
2922                    "throw",
2923                ));
2924                err!(self.builder.build_unreachable());
2925                self.builder.position_at_end(in_bounds_continue_block);
2926
2927                let casted_table_base = err!(self.builder.build_pointer_cast(
2930                    table_base,
2931                    self.context.ptr_type(AddressSpace::default()),
2932                    "casted_table_base",
2933                ));
2934
2935                let funcref_ptr = unsafe {
2936                    err!(self.builder.build_in_bounds_gep(
2937                        self.intrinsics.ptr_ty,
2938                        casted_table_base,
2939                        &[func_index],
2940                        "funcref_ptr",
2941                    ))
2942                };
2943
2944                let anyfunc_struct_ptr = err!(self.builder.build_load(
2946                    self.intrinsics.ptr_ty,
2947                    funcref_ptr,
2948                    "anyfunc_struct_ptr",
2949                ))
2950                .into_pointer_value();
2951
2952                {
2954                    let funcref_not_null = err!(
2955                        self.builder
2956                            .build_is_not_null(anyfunc_struct_ptr, "null funcref check")
2957                    );
2958
2959                    let funcref_continue_deref_block = self
2960                        .context
2961                        .append_basic_block(self.function, "funcref_continue deref_block");
2962
2963                    let funcref_is_null_block = self
2964                        .context
2965                        .append_basic_block(self.function, "funcref_is_null_block");
2966                    err!(self.builder.build_conditional_branch(
2967                        funcref_not_null,
2968                        funcref_continue_deref_block,
2969                        funcref_is_null_block,
2970                    ));
2971                    self.builder.position_at_end(funcref_is_null_block);
2972                    err!(self.builder.build_call(
2973                        self.intrinsics.throw_trap,
2974                        &[self.intrinsics.trap_call_indirect_null.into()],
2975                        "throw",
2976                    ));
2977                    err!(self.builder.build_unreachable());
2978                    self.builder.position_at_end(funcref_continue_deref_block);
2979                }
2980
2981                let func_ptr_ptr = self
2983                    .builder
2984                    .build_struct_gep(
2985                        self.intrinsics.anyfunc_ty,
2986                        anyfunc_struct_ptr,
2987                        0,
2988                        "func_ptr_ptr",
2989                    )
2990                    .unwrap();
2991                let sigindex_ptr = self
2992                    .builder
2993                    .build_struct_gep(
2994                        self.intrinsics.anyfunc_ty,
2995                        anyfunc_struct_ptr,
2996                        1,
2997                        "sigindex_ptr",
2998                    )
2999                    .unwrap();
3000                let ctx_ptr_ptr = self
3001                    .builder
3002                    .build_struct_gep(
3003                        self.intrinsics.anyfunc_ty,
3004                        anyfunc_struct_ptr,
3005                        2,
3006                        "ctx_ptr_ptr",
3007                    )
3008                    .unwrap();
3009                let (func_ptr, found_dynamic_sigindex, ctx_ptr) = (
3010                    err!(
3011                        self.builder
3012                            .build_load(self.intrinsics.ptr_ty, func_ptr_ptr, "func_ptr")
3013                    )
3014                    .into_pointer_value(),
3015                    err!(
3016                        self.builder
3017                            .build_load(self.intrinsics.i32_ty, sigindex_ptr, "sigindex")
3018                    )
3019                    .into_int_value(),
3020                    err!(
3021                        self.builder
3022                            .build_load(self.intrinsics.ptr_ty, ctx_ptr_ptr, "ctx_ptr")
3023                    ),
3024                );
3025
3026                let elem_initialized = err!(self.builder.build_is_not_null(func_ptr, ""));
3030
3031                let sigindices_equal = err!(self.builder.build_int_compare(
3034                    IntPredicate::EQ,
3035                    expected_dynamic_sigindex,
3036                    found_dynamic_sigindex,
3037                    "sigindices_equal",
3038                ));
3039
3040                let initialized_and_sigindices_match = err!(self.builder.build_and(
3041                    elem_initialized,
3042                    sigindices_equal,
3043                    ""
3044                ));
3045
3046                let initialized_and_sigindices_match = err!(self.builder.build_call(
3048                    self.intrinsics.expect_i1,
3049                    &[
3050                        initialized_and_sigindices_match.into(),
3051                        self.intrinsics.i1_ty.const_int(1, false).into(),
3052                    ],
3053                    "initialized_and_sigindices_match_expect",
3054                ))
3055                .try_as_basic_value()
3056                .left()
3057                .unwrap()
3058                .into_int_value();
3059
3060                let continue_block = self
3061                    .context
3062                    .append_basic_block(self.function, "continue_block");
3063                let sigindices_notequal_block = self
3064                    .context
3065                    .append_basic_block(self.function, "sigindices_notequal_block");
3066                err!(self.builder.build_conditional_branch(
3067                    initialized_and_sigindices_match,
3068                    continue_block,
3069                    sigindices_notequal_block,
3070                ));
3071
3072                self.builder.position_at_end(sigindices_notequal_block);
3073                let trap_code = err!(self.builder.build_select(
3074                    elem_initialized,
3075                    self.intrinsics.trap_call_indirect_sig,
3076                    self.intrinsics.trap_call_indirect_null,
3077                    "",
3078                ));
3079                err!(self.builder.build_call(
3080                    self.intrinsics.throw_trap,
3081                    &[trap_code.into()],
3082                    "throw"
3083                ));
3084                err!(self.builder.build_unreachable());
3085                self.builder.position_at_end(continue_block);
3086
3087                if self.g0m0.is_some() {
3088                    self.build_g0m0_indirect_call(
3089                        table_index,
3090                        ctx_ptr.into_pointer_value(),
3091                        func_type,
3092                        func_ptr,
3093                        func_index,
3094                    )?;
3095                } else {
3096                    let call_site = self.build_indirect_call(
3097                        ctx_ptr.into_pointer_value(),
3098                        func_type,
3099                        func_ptr,
3100                        None,
3101                        None,
3102                    )?;
3103
3104                    self.abi
3105                        .rets_from_call(&self.builder, self.intrinsics, call_site, func_type)?
3106                        .iter()
3107                        .for_each(|ret| self.state.push1(*ret));
3108                }
3109            }
3110
3111            Operator::I32Add | Operator::I64Add => {
3116                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3117                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3118                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3119                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3120                let res = err!(self.builder.build_int_add(v1, v2, ""));
3121                self.state.push1(res);
3122            }
3123            Operator::I8x16Add => {
3124                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3125                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
3126                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
3127                let res = err!(self.builder.build_int_add(v1, v2, ""));
3128                let res = err!(
3129                    self.builder
3130                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3131                );
3132                self.state.push1(res);
3133            }
3134            Operator::I16x8Add => {
3135                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3136                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3137                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3138                let res = err!(self.builder.build_int_add(v1, v2, ""));
3139                let res = err!(
3140                    self.builder
3141                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3142                );
3143                self.state.push1(res);
3144            }
3145            Operator::I16x8ExtAddPairwiseI8x16S | Operator::I16x8ExtAddPairwiseI8x16U => {
3146                let extend_op = match op {
3147                    Operator::I16x8ExtAddPairwiseI8x16S => {
3148                        |s: &Self, v| s.builder.build_int_s_extend(v, s.intrinsics.i16x8_ty, "")
3149                    }
3150                    Operator::I16x8ExtAddPairwiseI8x16U => {
3151                        |s: &Self, v| s.builder.build_int_z_extend(v, s.intrinsics.i16x8_ty, "")
3152                    }
3153                    _ => unreachable!("Unhandled internal variant"),
3154                };
3155                let (v, i) = self.state.pop1_extra()?;
3156                let (v, _) = self.v128_into_i8x16(v, i)?;
3157
3158                let left = err!(self.builder.build_shuffle_vector(
3159                    v,
3160                    v.get_type().get_undef(),
3161                    VectorType::const_vector(&[
3162                        self.intrinsics.i32_consts[0],
3163                        self.intrinsics.i32_consts[2],
3164                        self.intrinsics.i32_consts[4],
3165                        self.intrinsics.i32_consts[6],
3166                        self.intrinsics.i32_consts[8],
3167                        self.intrinsics.i32_consts[10],
3168                        self.intrinsics.i32_consts[12],
3169                        self.intrinsics.i32_consts[14],
3170                    ]),
3171                    "",
3172                ));
3173                let left = err!(extend_op(self, left));
3174                let right = err!(self.builder.build_shuffle_vector(
3175                    v,
3176                    v.get_type().get_undef(),
3177                    VectorType::const_vector(&[
3178                        self.intrinsics.i32_consts[1],
3179                        self.intrinsics.i32_consts[3],
3180                        self.intrinsics.i32_consts[5],
3181                        self.intrinsics.i32_consts[7],
3182                        self.intrinsics.i32_consts[9],
3183                        self.intrinsics.i32_consts[11],
3184                        self.intrinsics.i32_consts[13],
3185                        self.intrinsics.i32_consts[15],
3186                    ]),
3187                    "",
3188                ));
3189                let right = err!(extend_op(self, right));
3190
3191                let res = err!(self.builder.build_int_add(left, right, ""));
3192                let res = err!(
3193                    self.builder
3194                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3195                );
3196                self.state.push1(res);
3197            }
3198            Operator::I32x4Add => {
3199                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3200                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
3201                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
3202                let res = err!(self.builder.build_int_add(v1, v2, ""));
3203                let res = err!(
3204                    self.builder
3205                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3206                );
3207                self.state.push1(res);
3208            }
3209            Operator::I32x4ExtAddPairwiseI16x8S | Operator::I32x4ExtAddPairwiseI16x8U => {
3210                let extend_op = match op {
3211                    Operator::I32x4ExtAddPairwiseI16x8S => {
3212                        |s: &Self, v| s.builder.build_int_s_extend(v, s.intrinsics.i32x4_ty, "")
3213                    }
3214                    Operator::I32x4ExtAddPairwiseI16x8U => {
3215                        |s: &Self, v| s.builder.build_int_z_extend(v, s.intrinsics.i32x4_ty, "")
3216                    }
3217                    _ => unreachable!("Unhandled internal variant"),
3218                };
3219                let (v, i) = self.state.pop1_extra()?;
3220                let (v, _) = self.v128_into_i16x8(v, i)?;
3221
3222                let left = err!(self.builder.build_shuffle_vector(
3223                    v,
3224                    v.get_type().get_undef(),
3225                    VectorType::const_vector(&[
3226                        self.intrinsics.i32_consts[0],
3227                        self.intrinsics.i32_consts[2],
3228                        self.intrinsics.i32_consts[4],
3229                        self.intrinsics.i32_consts[6],
3230                    ]),
3231                    "",
3232                ));
3233                let left = err!(extend_op(self, left));
3234                let right = err!(self.builder.build_shuffle_vector(
3235                    v,
3236                    v.get_type().get_undef(),
3237                    VectorType::const_vector(&[
3238                        self.intrinsics.i32_consts[1],
3239                        self.intrinsics.i32_consts[3],
3240                        self.intrinsics.i32_consts[5],
3241                        self.intrinsics.i32_consts[7],
3242                    ]),
3243                    "",
3244                ));
3245                let right = err!(extend_op(self, right));
3246
3247                let res = err!(self.builder.build_int_add(left, right, ""));
3248                let res = err!(
3249                    self.builder
3250                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3251                );
3252                self.state.push1(res);
3253            }
3254            Operator::I64x2Add => {
3255                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3256                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
3257                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
3258                let res = err!(self.builder.build_int_add(v1, v2, ""));
3259                let res = err!(
3260                    self.builder
3261                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3262                );
3263                self.state.push1(res);
3264            }
3265            Operator::I8x16AddSatS => {
3266                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3267                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
3268                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
3269                let res = err!(self.builder.build_call(
3270                    self.intrinsics.sadd_sat_i8x16,
3271                    &[v1.into(), v2.into()],
3272                    ""
3273                ))
3274                .try_as_basic_value()
3275                .left()
3276                .unwrap();
3277                let res = err!(
3278                    self.builder
3279                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3280                );
3281                self.state.push1(res);
3282            }
3283            Operator::I16x8AddSatS => {
3284                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3285                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3286                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3287                let res = err!(self.builder.build_call(
3288                    self.intrinsics.sadd_sat_i16x8,
3289                    &[v1.into(), v2.into()],
3290                    ""
3291                ))
3292                .try_as_basic_value()
3293                .left()
3294                .unwrap();
3295                let res = err!(
3296                    self.builder
3297                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3298                );
3299                self.state.push1(res);
3300            }
3301            Operator::I8x16AddSatU => {
3302                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3303                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
3304                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
3305                let res = err!(self.builder.build_call(
3306                    self.intrinsics.uadd_sat_i8x16,
3307                    &[v1.into(), v2.into()],
3308                    ""
3309                ))
3310                .try_as_basic_value()
3311                .left()
3312                .unwrap();
3313                let res = err!(
3314                    self.builder
3315                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3316                );
3317                self.state.push1(res);
3318            }
3319            Operator::I16x8AddSatU => {
3320                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3321                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3322                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3323                let res = err!(self.builder.build_call(
3324                    self.intrinsics.uadd_sat_i16x8,
3325                    &[v1.into(), v2.into()],
3326                    ""
3327                ))
3328                .try_as_basic_value()
3329                .left()
3330                .unwrap();
3331                let res = err!(
3332                    self.builder
3333                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3334                );
3335                self.state.push1(res);
3336            }
3337            Operator::I32Sub | Operator::I64Sub => {
3338                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3339                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3340                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3341                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3342                let res = err!(self.builder.build_int_sub(v1, v2, ""));
3343                self.state.push1(res);
3344            }
3345            Operator::I8x16Sub => {
3346                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3347                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
3348                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
3349                let res = err!(self.builder.build_int_sub(v1, v2, ""));
3350                let res = err!(
3351                    self.builder
3352                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3353                );
3354                self.state.push1(res);
3355            }
3356            Operator::I16x8Sub => {
3357                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3358                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3359                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3360                let res = err!(self.builder.build_int_sub(v1, v2, ""));
3361                let res = err!(
3362                    self.builder
3363                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3364                );
3365                self.state.push1(res);
3366            }
3367            Operator::I32x4Sub => {
3368                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3369                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
3370                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
3371                let res = err!(self.builder.build_int_sub(v1, v2, ""));
3372                let res = err!(
3373                    self.builder
3374                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3375                );
3376                self.state.push1(res);
3377            }
3378            Operator::I64x2Sub => {
3379                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3380                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
3381                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
3382                let res = err!(self.builder.build_int_sub(v1, v2, ""));
3383                let res = err!(
3384                    self.builder
3385                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3386                );
3387                self.state.push1(res);
3388            }
3389            Operator::I8x16SubSatS => {
3390                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3391                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
3392                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
3393                let res = err!(self.builder.build_call(
3394                    self.intrinsics.ssub_sat_i8x16,
3395                    &[v1.into(), v2.into()],
3396                    ""
3397                ))
3398                .try_as_basic_value()
3399                .left()
3400                .unwrap();
3401                let res = err!(
3402                    self.builder
3403                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3404                );
3405                self.state.push1(res);
3406            }
3407            Operator::I16x8SubSatS => {
3408                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3409                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3410                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3411                let res = err!(self.builder.build_call(
3412                    self.intrinsics.ssub_sat_i16x8,
3413                    &[v1.into(), v2.into()],
3414                    ""
3415                ))
3416                .try_as_basic_value()
3417                .left()
3418                .unwrap();
3419                let res = err!(
3420                    self.builder
3421                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3422                );
3423                self.state.push1(res);
3424            }
3425            Operator::I8x16SubSatU => {
3426                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3427                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
3428                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
3429                let res = err!(self.builder.build_call(
3430                    self.intrinsics.usub_sat_i8x16,
3431                    &[v1.into(), v2.into()],
3432                    ""
3433                ))
3434                .try_as_basic_value()
3435                .left()
3436                .unwrap();
3437                let res = err!(
3438                    self.builder
3439                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3440                );
3441                self.state.push1(res);
3442            }
3443            Operator::I16x8SubSatU => {
3444                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3445                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3446                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3447                let res = err!(self.builder.build_call(
3448                    self.intrinsics.usub_sat_i16x8,
3449                    &[v1.into(), v2.into()],
3450                    ""
3451                ))
3452                .try_as_basic_value()
3453                .left()
3454                .unwrap();
3455                let res = err!(
3456                    self.builder
3457                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3458                );
3459                self.state.push1(res);
3460            }
3461            Operator::I32Mul | Operator::I64Mul => {
3462                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3463                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3464                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3465                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3466                let res = err!(self.builder.build_int_mul(v1, v2, ""));
3467                self.state.push1(res);
3468            }
3469            Operator::I16x8Mul => {
3470                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3471                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3472                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3473                let res = err!(self.builder.build_int_mul(v1, v2, ""));
3474                let res = err!(
3475                    self.builder
3476                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3477                );
3478                self.state.push1(res);
3479            }
3480            Operator::I32x4Mul => {
3481                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3482                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
3483                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
3484                let res = err!(self.builder.build_int_mul(v1, v2, ""));
3485                let res = err!(
3486                    self.builder
3487                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3488                );
3489                self.state.push1(res);
3490            }
3491            Operator::I64x2Mul => {
3492                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3493                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
3494                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
3495                let res = err!(self.builder.build_int_mul(v1, v2, ""));
3496                let res = err!(
3497                    self.builder
3498                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3499                );
3500                self.state.push1(res);
3501            }
3502            Operator::I16x8Q15MulrSatS => {
3503                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3504                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3505                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3506
3507                let max_value = self.intrinsics.i16_ty.const_int(i16::MAX as u64, false);
3508                let max_values = VectorType::const_vector(&[max_value; 8]);
3509
3510                let v1 = err!(
3511                    self.builder
3512                        .build_int_s_extend(v1, self.intrinsics.i32x8_ty, "")
3513                );
3514                let v2 = err!(
3515                    self.builder
3516                        .build_int_s_extend(v2, self.intrinsics.i32x8_ty, "")
3517                );
3518                let res = err!(self.builder.build_int_mul(v1, v2, ""));
3519
3520                let bit = self.intrinsics.i32_ty.const_int(0x4000, false);
3522                let bits = VectorType::const_vector(&[bit; 8]);
3523
3524                let res = err!(self.builder.build_int_add(res, bits, ""));
3525
3526                let fifteen = self.intrinsics.i32_consts[15];
3527                let fifteens = VectorType::const_vector(&[fifteen; 8]);
3528
3529                let res = err!(self.builder.build_right_shift(res, fifteens, true, ""));
3530                let saturate_up = {
3531                    let max_values = err!(self.builder.build_int_s_extend(
3532                        max_values,
3533                        self.intrinsics.i32x8_ty,
3534                        ""
3535                    ));
3536                    err!(
3537                        self.builder
3538                            .build_int_compare(IntPredicate::SGT, res, max_values, "")
3539                    )
3540                };
3541
3542                let res = err!(
3543                    self.builder
3544                        .build_int_truncate(res, self.intrinsics.i16x8_ty, "")
3545                );
3546
3547                let res = err!(self.builder.build_select(saturate_up, max_values, res, ""))
3548                    .into_vector_value();
3549                let res = err!(
3550                    self.builder
3551                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3552                );
3553                self.state.push1(res);
3554            }
3555            Operator::I16x8ExtMulLowI8x16S
3556            | Operator::I16x8ExtMulLowI8x16U
3557            | Operator::I16x8ExtMulHighI8x16S
3558            | Operator::I16x8ExtMulHighI8x16U => {
3559                let extend_op = match op {
3560                    Operator::I16x8ExtMulLowI8x16S | Operator::I16x8ExtMulHighI8x16S => {
3561                        |s: &Self, v| -> Result<VectorValue, CompileError> {
3562                            err_nt!(s.builder.build_int_s_extend(v, s.intrinsics.i16x8_ty, ""))
3563                        }
3564                    }
3565                    Operator::I16x8ExtMulLowI8x16U | Operator::I16x8ExtMulHighI8x16U => {
3566                        |s: &Self, v| -> Result<VectorValue, CompileError> {
3567                            err_nt!(s.builder.build_int_z_extend(v, s.intrinsics.i16x8_ty, ""))
3568                        }
3569                    }
3570                    _ => unreachable!("Unhandled internal variant"),
3571                };
3572                let shuffle_array = match op {
3573                    Operator::I16x8ExtMulLowI8x16S | Operator::I16x8ExtMulLowI8x16U => [
3574                        self.intrinsics.i32_consts[0],
3575                        self.intrinsics.i32_consts[2],
3576                        self.intrinsics.i32_consts[4],
3577                        self.intrinsics.i32_consts[6],
3578                        self.intrinsics.i32_consts[8],
3579                        self.intrinsics.i32_consts[10],
3580                        self.intrinsics.i32_consts[12],
3581                        self.intrinsics.i32_consts[14],
3582                    ],
3583                    Operator::I16x8ExtMulHighI8x16S | Operator::I16x8ExtMulHighI8x16U => [
3584                        self.intrinsics.i32_consts[1],
3585                        self.intrinsics.i32_consts[3],
3586                        self.intrinsics.i32_consts[5],
3587                        self.intrinsics.i32_consts[7],
3588                        self.intrinsics.i32_consts[9],
3589                        self.intrinsics.i32_consts[11],
3590                        self.intrinsics.i32_consts[13],
3591                        self.intrinsics.i32_consts[15],
3592                    ],
3593                    _ => unreachable!("Unhandled internal variant"),
3594                };
3595                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3596                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
3597                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
3598                let val1 = err!(self.builder.build_shuffle_vector(
3599                    v1,
3600                    v1.get_type().get_undef(),
3601                    VectorType::const_vector(&shuffle_array),
3602                    "",
3603                ));
3604                let val1 = err!(extend_op(self, val1));
3605                let val2 = err!(self.builder.build_shuffle_vector(
3606                    v2,
3607                    v2.get_type().get_undef(),
3608                    VectorType::const_vector(&shuffle_array),
3609                    "",
3610                ));
3611                let val2 = err!(extend_op(self, val2));
3612                let res = err!(self.builder.build_int_mul(val1, val2, ""));
3613                let res = err!(
3614                    self.builder
3615                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3616                );
3617                self.state.push1(res);
3618            }
3619            Operator::I32x4ExtMulLowI16x8S
3620            | Operator::I32x4ExtMulLowI16x8U
3621            | Operator::I32x4ExtMulHighI16x8S
3622            | Operator::I32x4ExtMulHighI16x8U => {
3623                let extend_op = match op {
3624                    Operator::I32x4ExtMulLowI16x8S | Operator::I32x4ExtMulHighI16x8S => {
3625                        |s: &Self, v| s.builder.build_int_s_extend(v, s.intrinsics.i32x4_ty, "")
3626                    }
3627                    Operator::I32x4ExtMulLowI16x8U | Operator::I32x4ExtMulHighI16x8U => {
3628                        |s: &Self, v| s.builder.build_int_z_extend(v, s.intrinsics.i32x4_ty, "")
3629                    }
3630                    _ => unreachable!("Unhandled internal variant"),
3631                };
3632                let shuffle_array = match op {
3633                    Operator::I32x4ExtMulLowI16x8S | Operator::I32x4ExtMulLowI16x8U => [
3634                        self.intrinsics.i32_consts[0],
3635                        self.intrinsics.i32_consts[2],
3636                        self.intrinsics.i32_consts[4],
3637                        self.intrinsics.i32_consts[6],
3638                    ],
3639                    Operator::I32x4ExtMulHighI16x8S | Operator::I32x4ExtMulHighI16x8U => [
3640                        self.intrinsics.i32_consts[1],
3641                        self.intrinsics.i32_consts[3],
3642                        self.intrinsics.i32_consts[5],
3643                        self.intrinsics.i32_consts[7],
3644                    ],
3645                    _ => unreachable!("Unhandled internal variant"),
3646                };
3647                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3648                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3649                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3650                let val1 = err!(self.builder.build_shuffle_vector(
3651                    v1,
3652                    v1.get_type().get_undef(),
3653                    VectorType::const_vector(&shuffle_array),
3654                    "",
3655                ));
3656                let val1 = err!(extend_op(self, val1));
3657                let val2 = err!(self.builder.build_shuffle_vector(
3658                    v2,
3659                    v2.get_type().get_undef(),
3660                    VectorType::const_vector(&shuffle_array),
3661                    "",
3662                ));
3663                let val2 = err!(extend_op(self, val2));
3664                let res = err!(self.builder.build_int_mul(val1, val2, ""));
3665                let res = err!(
3666                    self.builder
3667                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3668                );
3669                self.state.push1(res);
3670            }
3671            Operator::I64x2ExtMulLowI32x4S
3672            | Operator::I64x2ExtMulLowI32x4U
3673            | Operator::I64x2ExtMulHighI32x4S
3674            | Operator::I64x2ExtMulHighI32x4U => {
3675                let extend_op = match op {
3676                    Operator::I64x2ExtMulLowI32x4S | Operator::I64x2ExtMulHighI32x4S => {
3677                        |s: &Self, v| s.builder.build_int_s_extend(v, s.intrinsics.i64x2_ty, "")
3678                    }
3679                    Operator::I64x2ExtMulLowI32x4U | Operator::I64x2ExtMulHighI32x4U => {
3680                        |s: &Self, v| s.builder.build_int_z_extend(v, s.intrinsics.i64x2_ty, "")
3681                    }
3682                    _ => unreachable!("Unhandled internal variant"),
3683                };
3684                let shuffle_array = match op {
3685                    Operator::I64x2ExtMulLowI32x4S | Operator::I64x2ExtMulLowI32x4U => {
3686                        [self.intrinsics.i32_consts[0], self.intrinsics.i32_consts[2]]
3687                    }
3688                    Operator::I64x2ExtMulHighI32x4S | Operator::I64x2ExtMulHighI32x4U => {
3689                        [self.intrinsics.i32_consts[1], self.intrinsics.i32_consts[3]]
3690                    }
3691                    _ => unreachable!("Unhandled internal variant"),
3692                };
3693                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3694                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
3695                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
3696                let val1 = err!(self.builder.build_shuffle_vector(
3697                    v1,
3698                    v1.get_type().get_undef(),
3699                    VectorType::const_vector(&shuffle_array),
3700                    "",
3701                ));
3702                let val1 = err!(extend_op(self, val1));
3703                let val2 = err!(self.builder.build_shuffle_vector(
3704                    v2,
3705                    v2.get_type().get_undef(),
3706                    VectorType::const_vector(&shuffle_array),
3707                    "",
3708                ));
3709                let val2 = err!(extend_op(self, val2));
3710                let res = err!(self.builder.build_int_mul(val1, val2, ""));
3711                let res = err!(
3712                    self.builder
3713                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3714                );
3715                self.state.push1(res);
3716            }
3717            Operator::I32x4DotI16x8S => {
3718                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3719                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
3720                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
3721                let low_i16 = [
3722                    self.intrinsics.i32_consts[0],
3723                    self.intrinsics.i32_consts[2],
3724                    self.intrinsics.i32_consts[4],
3725                    self.intrinsics.i32_consts[6],
3726                ];
3727                let high_i16 = [
3728                    self.intrinsics.i32_consts[1],
3729                    self.intrinsics.i32_consts[3],
3730                    self.intrinsics.i32_consts[5],
3731                    self.intrinsics.i32_consts[7],
3732                ];
3733                let v1_low = err!(self.builder.build_shuffle_vector(
3734                    v1,
3735                    v1.get_type().get_undef(),
3736                    VectorType::const_vector(&low_i16),
3737                    "",
3738                ));
3739                let v1_low = err!(self.builder.build_int_s_extend(
3740                    v1_low,
3741                    self.intrinsics.i32x4_ty,
3742                    ""
3743                ));
3744                let v1_high = err!(self.builder.build_shuffle_vector(
3745                    v1,
3746                    v1.get_type().get_undef(),
3747                    VectorType::const_vector(&high_i16),
3748                    "",
3749                ));
3750                let v1_high = err!(self.builder.build_int_s_extend(
3751                    v1_high,
3752                    self.intrinsics.i32x4_ty,
3753                    ""
3754                ));
3755                let v2_low = err!(self.builder.build_shuffle_vector(
3756                    v2,
3757                    v2.get_type().get_undef(),
3758                    VectorType::const_vector(&low_i16),
3759                    "",
3760                ));
3761                let v2_low = err!(self.builder.build_int_s_extend(
3762                    v2_low,
3763                    self.intrinsics.i32x4_ty,
3764                    ""
3765                ));
3766                let v2_high = err!(self.builder.build_shuffle_vector(
3767                    v2,
3768                    v2.get_type().get_undef(),
3769                    VectorType::const_vector(&high_i16),
3770                    "",
3771                ));
3772                let v2_high = err!(self.builder.build_int_s_extend(
3773                    v2_high,
3774                    self.intrinsics.i32x4_ty,
3775                    ""
3776                ));
3777                let low_product = err!(self.builder.build_int_mul(v1_low, v2_low, ""));
3778                let high_product = err!(self.builder.build_int_mul(v1_high, v2_high, ""));
3779
3780                let res = err!(self.builder.build_int_add(low_product, high_product, ""));
3781                let res = err!(
3782                    self.builder
3783                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3784                );
3785                self.state.push1(res);
3786            }
3787            Operator::I32DivS | Operator::I64DivS => {
3788                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3789                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3790                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3791                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3792
3793                self.trap_if_zero_or_overflow(v1, v2)?;
3794
3795                let res = err!(self.builder.build_int_signed_div(v1, v2, ""));
3796                self.state.push1(res);
3797            }
3798            Operator::I32DivU | Operator::I64DivU => {
3799                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3800                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3801                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3802                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3803
3804                self.trap_if_zero(v2)?;
3805
3806                let res = err!(self.builder.build_int_unsigned_div(v1, v2, ""));
3807                self.state.push1(res);
3808            }
3809            Operator::I32RemS | Operator::I64RemS => {
3810                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3811                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3812                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3813                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3814                let int_type = v1.get_type();
3815                let (min_value, neg_one_value) = if int_type == self.intrinsics.i32_ty {
3816                    let min_value = int_type.const_int(i32::MIN as u64, false);
3817                    let neg_one_value = int_type.const_int(-1i32 as u32 as u64, false);
3818                    (min_value, neg_one_value)
3819                } else if int_type == self.intrinsics.i64_ty {
3820                    let min_value = int_type.const_int(i64::MIN as u64, false);
3821                    let neg_one_value = int_type.const_int(-1i64 as u64, false);
3822                    (min_value, neg_one_value)
3823                } else {
3824                    unreachable!()
3825                };
3826
3827                self.trap_if_zero(v2)?;
3828
3829                let will_overflow = err!(self.builder.build_and(
3841                    err!(self.builder.build_int_compare(
3842                        IntPredicate::EQ,
3843                        v1,
3844                        min_value,
3845                        "left_is_min"
3846                    )),
3847                    err!(self.builder.build_int_compare(
3848                        IntPredicate::EQ,
3849                        v2,
3850                        neg_one_value,
3851                        "right_is_neg_one",
3852                    )),
3853                    "srem_will_overflow",
3854                ));
3855                let v1 =
3856                    err!(
3857                        self.builder
3858                            .build_select(will_overflow, int_type.const_zero(), v1, "")
3859                    )
3860                    .into_int_value();
3861                let res = err!(self.builder.build_int_signed_rem(v1, v2, ""));
3862                self.state.push1(res);
3863            }
3864            Operator::I32RemU | Operator::I64RemU => {
3865                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3866                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3867                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3868                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3869
3870                self.trap_if_zero(v2)?;
3871
3872                let res = err!(self.builder.build_int_unsigned_rem(v1, v2, ""));
3873                self.state.push1(res);
3874            }
3875            Operator::I32And | Operator::I64And | Operator::V128And => {
3876                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3877                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3878                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3879                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3880                let res = err!(self.builder.build_and(v1, v2, ""));
3881                self.state.push1(res);
3882            }
3883            Operator::I32Or | Operator::I64Or | Operator::V128Or => {
3884                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3885                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3886                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3887                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3888                let res = err!(self.builder.build_or(v1, v2, ""));
3889                self.state.push1(res);
3890            }
3891            Operator::I32Xor | Operator::I64Xor | Operator::V128Xor => {
3892                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3893                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3894                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3895                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3896                let res = err!(self.builder.build_xor(v1, v2, ""));
3897                self.state.push1(res);
3898            }
3899            Operator::V128AndNot => {
3900                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
3901                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3902                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3903                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
3904                let v2 = err!(self.builder.build_not(v2, ""));
3905                let res = err!(self.builder.build_and(v1, v2, ""));
3906                self.state.push1(res);
3907            }
3908            Operator::V128Bitselect => {
3909                let ((v1, i1), (v2, i2), (cond, cond_info)) = self.state.pop3_extra()?;
3910                let v1 = self.apply_pending_canonicalization(v1, i1)?;
3911                let v2 = self.apply_pending_canonicalization(v2, i2)?;
3912                let cond = self.apply_pending_canonicalization(cond, cond_info)?;
3913                let v1 = err!(
3914                    self.builder
3915                        .build_bit_cast(v1, self.intrinsics.i1x128_ty, "")
3916                )
3917                .into_vector_value();
3918                let v2 = err!(
3919                    self.builder
3920                        .build_bit_cast(v2, self.intrinsics.i1x128_ty, "")
3921                )
3922                .into_vector_value();
3923                let cond = err!(
3924                    self.builder
3925                        .build_bit_cast(cond, self.intrinsics.i1x128_ty, "")
3926                )
3927                .into_vector_value();
3928                let res = err!(self.builder.build_select(cond, v1, v2, ""));
3929                let res = err!(
3930                    self.builder
3931                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
3932                );
3933                self.state.push1(res);
3934            }
3935            Operator::I8x16Bitmask => {
3936                let (v, i) = self.state.pop1_extra()?;
3937                let (v, _) = self.v128_into_i8x16(v, i)?;
3938
3939                let zeros = self.intrinsics.i8x16_ty.const_zero();
3940                let res = err!(
3941                    self.builder
3942                        .build_int_compare(IntPredicate::SLT, v, zeros, "")
3943                );
3944                let res = err!(self.builder.build_bit_cast(res, self.intrinsics.i16_ty, ""))
3945                    .into_int_value();
3946                let res = err!(
3947                    self.builder
3948                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
3949                );
3950                self.state.push1(res);
3951            }
3952            Operator::I16x8Bitmask => {
3953                let (v, i) = self.state.pop1_extra()?;
3954                let (v, _) = self.v128_into_i16x8(v, i)?;
3955
3956                let zeros = self.intrinsics.i16x8_ty.const_zero();
3957                let res = err!(
3958                    self.builder
3959                        .build_int_compare(IntPredicate::SLT, v, zeros, "")
3960                );
3961                let res = err!(self.builder.build_bit_cast(res, self.intrinsics.i8_ty, ""))
3962                    .into_int_value();
3963                let res = err!(
3964                    self.builder
3965                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
3966                );
3967                self.state.push1(res);
3968            }
3969            Operator::I32x4Bitmask => {
3970                let (v, i) = self.state.pop1_extra()?;
3971                let (v, _) = self.v128_into_i32x4(v, i)?;
3972
3973                let zeros = self.intrinsics.i32x4_ty.const_zero();
3974                let res = err!(
3975                    self.builder
3976                        .build_int_compare(IntPredicate::SLT, v, zeros, "")
3977                );
3978                let res = err!(self.builder.build_bit_cast(res, self.intrinsics.i4_ty, ""))
3979                    .into_int_value();
3980                let res = err!(
3981                    self.builder
3982                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
3983                );
3984                self.state.push1(res);
3985            }
3986            Operator::I64x2Bitmask => {
3987                let (v, i) = self.state.pop1_extra()?;
3988                let (v, _) = self.v128_into_i64x2(v, i)?;
3989
3990                let zeros = self.intrinsics.i64x2_ty.const_zero();
3991                let res = err!(
3992                    self.builder
3993                        .build_int_compare(IntPredicate::SLT, v, zeros, "")
3994                );
3995                let res = err!(self.builder.build_bit_cast(res, self.intrinsics.i2_ty, ""))
3996                    .into_int_value();
3997                let res = err!(
3998                    self.builder
3999                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
4000                );
4001                self.state.push1(res);
4002            }
4003            Operator::I32Shl => {
4004                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4005                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4006                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4007                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4008                let mask = self.intrinsics.i32_ty.const_int(31u64, false);
4009                let v2 = err!(self.builder.build_and(v2, mask, ""));
4010                let res = err!(self.builder.build_left_shift(v1, v2, ""));
4011                self.state.push1(res);
4012            }
4013            Operator::I64Shl => {
4014                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4015                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4016                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4017                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4018                let mask = self.intrinsics.i64_ty.const_int(63u64, false);
4019                let v2 = err!(self.builder.build_and(v2, mask, ""));
4020                let res = err!(self.builder.build_left_shift(v1, v2, ""));
4021                self.state.push1(res);
4022            }
4023            Operator::I8x16Shl => {
4024                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4025                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4026                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4027                let v2 = v2.into_int_value();
4028                let v2 = err!(
4029                    self.builder
4030                        .build_and(v2, self.intrinsics.i32_consts[7], "")
4031                );
4032                let v2 = err!(
4033                    self.builder
4034                        .build_int_truncate(v2, self.intrinsics.i8_ty, "")
4035                );
4036                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i8x16_ty)?;
4037                let res = err!(self.builder.build_left_shift(v1, v2, ""));
4038                let res = err!(
4039                    self.builder
4040                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4041                );
4042                self.state.push1(res);
4043            }
4044            Operator::I16x8Shl => {
4045                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4046                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4047                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4048                let v2 = v2.into_int_value();
4049                let v2 = err!(
4050                    self.builder
4051                        .build_and(v2, self.intrinsics.i32_consts[15], "")
4052                );
4053                let v2 = err!(
4054                    self.builder
4055                        .build_int_truncate(v2, self.intrinsics.i16_ty, "")
4056                );
4057                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i16x8_ty)?;
4058                let res = err!(self.builder.build_left_shift(v1, v2, ""));
4059                let res = err!(
4060                    self.builder
4061                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4062                );
4063                self.state.push1(res);
4064            }
4065            Operator::I32x4Shl => {
4066                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4067                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
4068                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4069                let v2 = v2.into_int_value();
4070                let v2 = err!(self.builder.build_and(
4071                    v2,
4072                    self.intrinsics.i32_ty.const_int(31, false),
4073                    ""
4074                ));
4075                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i32x4_ty)?;
4076                let res = err!(self.builder.build_left_shift(v1, v2, ""));
4077                let res = err!(
4078                    self.builder
4079                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4080                );
4081                self.state.push1(res);
4082            }
4083            Operator::I64x2Shl => {
4084                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4085                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
4086                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4087                let v2 = v2.into_int_value();
4088                let v2 = err!(self.builder.build_and(
4089                    v2,
4090                    self.intrinsics.i32_ty.const_int(63, false),
4091                    ""
4092                ));
4093                let v2 = err!(
4094                    self.builder
4095                        .build_int_z_extend(v2, self.intrinsics.i64_ty, "")
4096                );
4097                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i64x2_ty)?;
4098                let res = err!(self.builder.build_left_shift(v1, v2, ""));
4099                let res = err!(
4100                    self.builder
4101                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4102                );
4103                self.state.push1(res);
4104            }
4105            Operator::I32ShrS => {
4106                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4107                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4108                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4109                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4110                let mask = self.intrinsics.i32_ty.const_int(31u64, false);
4111                let v2 = err!(self.builder.build_and(v2, mask, ""));
4112                let res = err!(self.builder.build_right_shift(v1, v2, true, ""));
4113                self.state.push1(res);
4114            }
4115            Operator::I64ShrS => {
4116                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4117                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4118                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4119                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4120                let mask = self.intrinsics.i64_ty.const_int(63u64, false);
4121                let v2 = err!(self.builder.build_and(v2, mask, ""));
4122                let res = err!(self.builder.build_right_shift(v1, v2, true, ""));
4123                self.state.push1(res);
4124            }
4125            Operator::I8x16ShrS => {
4126                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4127                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4128                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4129                let v2 = v2.into_int_value();
4130                let v2 = err!(
4131                    self.builder
4132                        .build_and(v2, self.intrinsics.i32_consts[7], "")
4133                );
4134                let v2 = err!(
4135                    self.builder
4136                        .build_int_truncate(v2, self.intrinsics.i8_ty, "")
4137                );
4138                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i8x16_ty)?;
4139                let res = err!(self.builder.build_right_shift(v1, v2, true, ""));
4140                let res = err!(
4141                    self.builder
4142                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4143                );
4144                self.state.push1(res);
4145            }
4146            Operator::I16x8ShrS => {
4147                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4148                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4149                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4150                let v2 = v2.into_int_value();
4151                let v2 = err!(
4152                    self.builder
4153                        .build_and(v2, self.intrinsics.i32_consts[15], "")
4154                );
4155                let v2 = err!(
4156                    self.builder
4157                        .build_int_truncate(v2, self.intrinsics.i16_ty, "")
4158                );
4159                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i16x8_ty)?;
4160                let res = err!(self.builder.build_right_shift(v1, v2, true, ""));
4161                let res = err!(
4162                    self.builder
4163                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4164                );
4165                self.state.push1(res);
4166            }
4167            Operator::I32x4ShrS => {
4168                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4169                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
4170                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4171                let v2 = v2.into_int_value();
4172                let v2 = err!(self.builder.build_and(
4173                    v2,
4174                    self.intrinsics.i32_ty.const_int(31, false),
4175                    ""
4176                ));
4177                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i32x4_ty)?;
4178                let res = err!(self.builder.build_right_shift(v1, v2, true, ""));
4179                let res = err!(
4180                    self.builder
4181                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4182                );
4183                self.state.push1(res);
4184            }
4185            Operator::I64x2ShrS => {
4186                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4187                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
4188                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4189                let v2 = v2.into_int_value();
4190                let v2 = err!(self.builder.build_and(
4191                    v2,
4192                    self.intrinsics.i32_ty.const_int(63, false),
4193                    ""
4194                ));
4195                let v2 = err!(
4196                    self.builder
4197                        .build_int_z_extend(v2, self.intrinsics.i64_ty, "")
4198                );
4199                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i64x2_ty)?;
4200                let res = err!(self.builder.build_right_shift(v1, v2, true, ""));
4201                let res = err!(
4202                    self.builder
4203                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4204                );
4205                self.state.push1(res);
4206            }
4207            Operator::I32ShrU => {
4208                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4209                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4210                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4211                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4212                let mask = self.intrinsics.i32_ty.const_int(31u64, false);
4213                let v2 = err!(self.builder.build_and(v2, mask, ""));
4214                let res = err!(self.builder.build_right_shift(v1, v2, false, ""));
4215                self.state.push1(res);
4216            }
4217            Operator::I64ShrU => {
4218                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4219                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4220                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4221                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4222                let mask = self.intrinsics.i64_ty.const_int(63u64, false);
4223                let v2 = err!(self.builder.build_and(v2, mask, ""));
4224                let res = err!(self.builder.build_right_shift(v1, v2, false, ""));
4225                self.state.push1(res);
4226            }
4227            Operator::I8x16ShrU => {
4228                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4229                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4230                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4231                let v2 = v2.into_int_value();
4232                let v2 = err!(
4233                    self.builder
4234                        .build_and(v2, self.intrinsics.i32_consts[7], "")
4235                );
4236                let v2 = err!(
4237                    self.builder
4238                        .build_int_truncate(v2, self.intrinsics.i8_ty, "")
4239                );
4240                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i8x16_ty)?;
4241                let res = err!(self.builder.build_right_shift(v1, v2, false, ""));
4242                let res = err!(
4243                    self.builder
4244                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4245                );
4246                self.state.push1(res);
4247            }
4248            Operator::I16x8ShrU => {
4249                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4250                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4251                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4252                let v2 = v2.into_int_value();
4253                let v2 = err!(
4254                    self.builder
4255                        .build_and(v2, self.intrinsics.i32_consts[15], "")
4256                );
4257                let v2 = err!(
4258                    self.builder
4259                        .build_int_truncate(v2, self.intrinsics.i16_ty, "")
4260                );
4261                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i16x8_ty)?;
4262                let res = err!(self.builder.build_right_shift(v1, v2, false, ""));
4263                let res = err!(
4264                    self.builder
4265                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4266                );
4267                self.state.push1(res);
4268            }
4269            Operator::I32x4ShrU => {
4270                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4271                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
4272                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4273                let v2 = v2.into_int_value();
4274                let v2 = err!(self.builder.build_and(
4275                    v2,
4276                    self.intrinsics.i32_ty.const_int(31, false),
4277                    ""
4278                ));
4279                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i32x4_ty)?;
4280                let res = err!(self.builder.build_right_shift(v1, v2, false, ""));
4281                let res = err!(
4282                    self.builder
4283                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4284                );
4285                self.state.push1(res);
4286            }
4287            Operator::I64x2ShrU => {
4288                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4289                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
4290                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4291                let v2 = v2.into_int_value();
4292                let v2 = err!(self.builder.build_and(
4293                    v2,
4294                    self.intrinsics.i32_ty.const_int(63, false),
4295                    ""
4296                ));
4297                let v2 = err!(
4298                    self.builder
4299                        .build_int_z_extend(v2, self.intrinsics.i64_ty, "")
4300                );
4301                let v2 = self.splat_vector(v2.as_basic_value_enum(), self.intrinsics.i64x2_ty)?;
4302                let res = err!(self.builder.build_right_shift(v1, v2, false, ""));
4303                let res = err!(
4304                    self.builder
4305                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4306                );
4307                self.state.push1(res);
4308            }
4309            Operator::I32Rotl => {
4310                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4311                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4312                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4313                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4314                let mask = self.intrinsics.i32_ty.const_int(31u64, false);
4315                let v2 = err!(self.builder.build_and(v2, mask, ""));
4316                let lhs = err!(self.builder.build_left_shift(v1, v2, ""));
4317                let rhs = {
4318                    let negv2 = err!(self.builder.build_int_neg(v2, ""));
4319                    let rhs = err!(self.builder.build_and(negv2, mask, ""));
4320                    err!(self.builder.build_right_shift(v1, rhs, false, ""))
4321                };
4322                let res = err!(self.builder.build_or(lhs, rhs, ""));
4323                self.state.push1(res);
4324            }
4325            Operator::I64Rotl => {
4326                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4327                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4328                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4329                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4330                let mask = self.intrinsics.i64_ty.const_int(63u64, false);
4331                let v2 = err!(self.builder.build_and(v2, mask, ""));
4332                let lhs = err!(self.builder.build_left_shift(v1, v2, ""));
4333                let rhs = {
4334                    let negv2 = err!(self.builder.build_int_neg(v2, ""));
4335                    let rhs = err!(self.builder.build_and(negv2, mask, ""));
4336                    err!(self.builder.build_right_shift(v1, rhs, false, ""))
4337                };
4338                let res = err!(self.builder.build_or(lhs, rhs, ""));
4339                self.state.push1(res);
4340            }
4341            Operator::I32Rotr => {
4342                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4343                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4344                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4345                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4346                let mask = self.intrinsics.i32_ty.const_int(31u64, false);
4347                let v2 = err!(self.builder.build_and(v2, mask, ""));
4348                let lhs = err!(self.builder.build_right_shift(v1, v2, false, ""));
4349                let rhs = {
4350                    let negv2 = err!(self.builder.build_int_neg(v2, ""));
4351                    let rhs = err!(self.builder.build_and(negv2, mask, ""));
4352                    err!(self.builder.build_left_shift(v1, rhs, ""))
4353                };
4354                let res = err!(self.builder.build_or(lhs, rhs, ""));
4355                self.state.push1(res);
4356            }
4357            Operator::I64Rotr => {
4358                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4359                let v1 = self.apply_pending_canonicalization(v1, i1)?;
4360                let v2 = self.apply_pending_canonicalization(v2, i2)?;
4361                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
4362                let mask = self.intrinsics.i64_ty.const_int(63u64, false);
4363                let v2 = err!(self.builder.build_and(v2, mask, ""));
4364                let lhs = err!(self.builder.build_right_shift(v1, v2, false, ""));
4365                let rhs = {
4366                    let negv2 = err!(self.builder.build_int_neg(v2, ""));
4367                    let rhs = err!(self.builder.build_and(negv2, mask, ""));
4368                    err!(self.builder.build_left_shift(v1, rhs, ""))
4369                };
4370                let res = err!(self.builder.build_or(lhs, rhs, ""));
4371                self.state.push1(res);
4372            }
4373            Operator::I32Clz => {
4374                let (input, info) = self.state.pop1_extra()?;
4375                let input = self.apply_pending_canonicalization(input, info)?;
4376                let is_zero_undef = self.intrinsics.i1_zero;
4377                let res = err!(self.builder.build_call(
4378                    self.intrinsics.ctlz_i32,
4379                    &[input.into(), is_zero_undef.into()],
4380                    "",
4381                ))
4382                .try_as_basic_value()
4383                .left()
4384                .unwrap();
4385                self.state.push1_extra(res, ExtraInfo::arithmetic_f32());
4386            }
4387            Operator::I64Clz => {
4388                let (input, info) = self.state.pop1_extra()?;
4389                let input = self.apply_pending_canonicalization(input, info)?;
4390                let is_zero_undef = self.intrinsics.i1_zero;
4391                let res = err!(self.builder.build_call(
4392                    self.intrinsics.ctlz_i64,
4393                    &[input.into(), is_zero_undef.into()],
4394                    "",
4395                ))
4396                .try_as_basic_value()
4397                .left()
4398                .unwrap();
4399                self.state.push1_extra(res, ExtraInfo::arithmetic_f64());
4400            }
4401            Operator::I32Ctz => {
4402                let (input, info) = self.state.pop1_extra()?;
4403                let input = self.apply_pending_canonicalization(input, info)?;
4404                let is_zero_undef = self.intrinsics.i1_zero;
4405                let res = err!(self.builder.build_call(
4406                    self.intrinsics.cttz_i32,
4407                    &[input.into(), is_zero_undef.into()],
4408                    "",
4409                ))
4410                .try_as_basic_value()
4411                .left()
4412                .unwrap();
4413                self.state.push1_extra(res, ExtraInfo::arithmetic_f32());
4414            }
4415            Operator::I64Ctz => {
4416                let (input, info) = self.state.pop1_extra()?;
4417                let input = self.apply_pending_canonicalization(input, info)?;
4418                let is_zero_undef = self.intrinsics.i1_zero;
4419                let res = err!(self.builder.build_call(
4420                    self.intrinsics.cttz_i64,
4421                    &[input.into(), is_zero_undef.into()],
4422                    "",
4423                ))
4424                .try_as_basic_value()
4425                .left()
4426                .unwrap();
4427                self.state.push1_extra(res, ExtraInfo::arithmetic_f64());
4428            }
4429            Operator::I8x16Popcnt => {
4430                let (v, i) = self.state.pop1_extra()?;
4431                let (v, _) = self.v128_into_i8x16(v, i)?;
4432                let res = err!(self.builder.build_call(
4433                    self.intrinsics.ctpop_i8x16,
4434                    &[v.into()],
4435                    ""
4436                ))
4437                .try_as_basic_value()
4438                .left()
4439                .unwrap();
4440                let res = err!(
4441                    self.builder
4442                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4443                );
4444                self.state.push1(res);
4445            }
4446            Operator::I32Popcnt => {
4447                let (input, info) = self.state.pop1_extra()?;
4448                let input = self.apply_pending_canonicalization(input, info)?;
4449                let res = err!(self.builder.build_call(
4450                    self.intrinsics.ctpop_i32,
4451                    &[input.into()],
4452                    ""
4453                ))
4454                .try_as_basic_value()
4455                .left()
4456                .unwrap();
4457                self.state.push1_extra(res, ExtraInfo::arithmetic_f32());
4458            }
4459            Operator::I64Popcnt => {
4460                let (input, info) = self.state.pop1_extra()?;
4461                let input = self.apply_pending_canonicalization(input, info)?;
4462                let res = err!(self.builder.build_call(
4463                    self.intrinsics.ctpop_i64,
4464                    &[input.into()],
4465                    ""
4466                ))
4467                .try_as_basic_value()
4468                .left()
4469                .unwrap();
4470                self.state.push1_extra(res, ExtraInfo::arithmetic_f64());
4471            }
4472            Operator::I32Eqz => {
4473                let input = self.state.pop1()?.into_int_value();
4474                let cond = err!(self.builder.build_int_compare(
4475                    IntPredicate::EQ,
4476                    input,
4477                    self.intrinsics.i32_zero,
4478                    "",
4479                ));
4480                let res = err!(
4481                    self.builder
4482                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
4483                );
4484                self.state.push1_extra(res, ExtraInfo::arithmetic_f32());
4485            }
4486            Operator::I64Eqz => {
4487                let input = self.state.pop1()?.into_int_value();
4488                let cond = err!(self.builder.build_int_compare(
4489                    IntPredicate::EQ,
4490                    input,
4491                    self.intrinsics.i64_zero,
4492                    "",
4493                ));
4494                let res = err!(
4495                    self.builder
4496                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
4497                );
4498                self.state.push1_extra(res, ExtraInfo::arithmetic_f64());
4499            }
4500            Operator::I8x16Abs => {
4501                let (v, i) = self.state.pop1_extra()?;
4502                let (v, _) = self.v128_into_i8x16(v, i)?;
4503
4504                let seven = self.intrinsics.i8_ty.const_int(7, false);
4505                let seven = VectorType::const_vector(&[seven; 16]);
4506                let all_sign_bits = err!(self.builder.build_right_shift(v, seven, true, ""));
4507                let xor = err!(self.builder.build_xor(v, all_sign_bits, ""));
4508                let res = err!(self.builder.build_int_sub(xor, all_sign_bits, ""));
4509                let res = err!(
4510                    self.builder
4511                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4512                );
4513                self.state.push1(res);
4514            }
4515            Operator::I16x8Abs => {
4516                let (v, i) = self.state.pop1_extra()?;
4517                let (v, _) = self.v128_into_i16x8(v, i)?;
4518
4519                let fifteen = self.intrinsics.i16_ty.const_int(15, false);
4520                let fifteen = VectorType::const_vector(&[fifteen; 8]);
4521                let all_sign_bits = err!(self.builder.build_right_shift(v, fifteen, true, ""));
4522                let xor = err!(self.builder.build_xor(v, all_sign_bits, ""));
4523                let res = err!(self.builder.build_int_sub(xor, all_sign_bits, ""));
4524                let res = err!(
4525                    self.builder
4526                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4527                );
4528                self.state.push1(res);
4529            }
4530            Operator::I32x4Abs => {
4531                let (v, i) = self.state.pop1_extra()?;
4532                let (v, _) = self.v128_into_i32x4(v, i)?;
4533
4534                let thirtyone = self.intrinsics.i32_ty.const_int(31, false);
4535                let thirtyone = VectorType::const_vector(&[thirtyone; 4]);
4536                let all_sign_bits = err!(self.builder.build_right_shift(v, thirtyone, true, ""));
4537                let xor = err!(self.builder.build_xor(v, all_sign_bits, ""));
4538                let res = err!(self.builder.build_int_sub(xor, all_sign_bits, ""));
4539                let res = err!(
4540                    self.builder
4541                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4542                );
4543                self.state.push1(res);
4544            }
4545            Operator::I64x2Abs => {
4546                let (v, i) = self.state.pop1_extra()?;
4547                let (v, _) = self.v128_into_i64x2(v, i)?;
4548
4549                let sixtythree = self.intrinsics.i64_ty.const_int(63, false);
4550                let sixtythree = VectorType::const_vector(&[sixtythree; 2]);
4551                let all_sign_bits = err!(self.builder.build_right_shift(v, sixtythree, true, ""));
4552                let xor = err!(self.builder.build_xor(v, all_sign_bits, ""));
4553                let res = err!(self.builder.build_int_sub(xor, all_sign_bits, ""));
4554                let res = err!(
4555                    self.builder
4556                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4557                );
4558                self.state.push1(res);
4559            }
4560            Operator::I8x16MinS => {
4561                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4562                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4563                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
4564                let cmp = err!(
4565                    self.builder
4566                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
4567                );
4568                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4569                let res = err!(
4570                    self.builder
4571                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4572                );
4573                self.state.push1(res);
4574            }
4575            Operator::I8x16MinU => {
4576                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4577                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4578                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
4579                let cmp = err!(
4580                    self.builder
4581                        .build_int_compare(IntPredicate::ULT, v1, v2, "")
4582                );
4583                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4584                let res = err!(
4585                    self.builder
4586                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4587                );
4588                self.state.push1(res);
4589            }
4590            Operator::I8x16MaxS => {
4591                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4592                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4593                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
4594                let cmp = err!(
4595                    self.builder
4596                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
4597                );
4598                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4599                let res = err!(
4600                    self.builder
4601                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4602                );
4603                self.state.push1(res);
4604            }
4605            Operator::I8x16MaxU => {
4606                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4607                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4608                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
4609                let cmp = err!(
4610                    self.builder
4611                        .build_int_compare(IntPredicate::UGT, v1, v2, "")
4612                );
4613                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4614                let res = err!(
4615                    self.builder
4616                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4617                );
4618                self.state.push1(res);
4619            }
4620            Operator::I16x8MinS => {
4621                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4622                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4623                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
4624                let cmp = err!(
4625                    self.builder
4626                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
4627                );
4628                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4629                let res = err!(
4630                    self.builder
4631                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4632                );
4633                self.state.push1(res);
4634            }
4635            Operator::I16x8MinU => {
4636                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4637                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4638                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
4639                let cmp = err!(
4640                    self.builder
4641                        .build_int_compare(IntPredicate::ULT, v1, v2, "")
4642                );
4643                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4644                let res = err!(
4645                    self.builder
4646                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4647                );
4648                self.state.push1(res);
4649            }
4650            Operator::I16x8MaxS => {
4651                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4652                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4653                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
4654                let cmp = err!(
4655                    self.builder
4656                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
4657                );
4658                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4659                let res = err!(
4660                    self.builder
4661                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4662                );
4663                self.state.push1(res);
4664            }
4665            Operator::I16x8MaxU => {
4666                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4667                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4668                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
4669                let cmp = err!(
4670                    self.builder
4671                        .build_int_compare(IntPredicate::UGT, v1, v2, "")
4672                );
4673                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4674                let res = err!(
4675                    self.builder
4676                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4677                );
4678                self.state.push1(res);
4679            }
4680            Operator::I32x4MinS => {
4681                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4682                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
4683                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
4684                let cmp = err!(
4685                    self.builder
4686                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
4687                );
4688                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4689                let res = err!(
4690                    self.builder
4691                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4692                );
4693                self.state.push1(res);
4694            }
4695            Operator::I32x4MinU => {
4696                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4697                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
4698                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
4699                let cmp = err!(
4700                    self.builder
4701                        .build_int_compare(IntPredicate::ULT, v1, v2, "")
4702                );
4703                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4704                let res = err!(
4705                    self.builder
4706                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4707                );
4708                self.state.push1(res);
4709            }
4710            Operator::I32x4MaxS => {
4711                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4712                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
4713                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
4714                let cmp = err!(
4715                    self.builder
4716                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
4717                );
4718                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4719                let res = err!(
4720                    self.builder
4721                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4722                );
4723                self.state.push1(res);
4724            }
4725            Operator::I32x4MaxU => {
4726                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4727                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
4728                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
4729                let cmp = err!(
4730                    self.builder
4731                        .build_int_compare(IntPredicate::UGT, v1, v2, "")
4732                );
4733                let res = err!(self.builder.build_select(cmp, v1, v2, ""));
4734                let res = err!(
4735                    self.builder
4736                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4737                );
4738                self.state.push1(res);
4739            }
4740            Operator::I8x16AvgrU => {
4741                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4742                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
4743                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
4744
4745                let ext_ty = self.intrinsics.i16_ty.vec_type(16);
4756                let one = self.intrinsics.i16_ty.const_int(1, false);
4757                let one = VectorType::const_vector(&[one; 16]);
4758
4759                let v1 = err!(self.builder.build_int_z_extend(v1, ext_ty, ""));
4760                let v2 = err!(self.builder.build_int_z_extend(v2, ext_ty, ""));
4761                let res = err!(self.builder.build_int_add(
4762                    err!(self.builder.build_int_add(one, v1, "")),
4763                    v2,
4764                    ""
4765                ));
4766                let res = err!(self.builder.build_right_shift(res, one, false, ""));
4767                let res = err!(
4768                    self.builder
4769                        .build_int_truncate(res, self.intrinsics.i8x16_ty, "")
4770                );
4771                let res = err!(
4772                    self.builder
4773                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4774                );
4775                self.state.push1(res);
4776            }
4777            Operator::I16x8AvgrU => {
4778                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4779                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
4780                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
4781
4782                let ext_ty = self.intrinsics.i32_ty.vec_type(8);
4793                let one = self.intrinsics.i32_consts[1];
4794                let one = VectorType::const_vector(&[one; 8]);
4795
4796                let v1 = err!(self.builder.build_int_z_extend(v1, ext_ty, ""));
4797                let v2 = err!(self.builder.build_int_z_extend(v2, ext_ty, ""));
4798                let res = err!(self.builder.build_int_add(
4799                    err!(self.builder.build_int_add(one, v1, "")),
4800                    v2,
4801                    ""
4802                ));
4803                let res = err!(self.builder.build_right_shift(res, one, false, ""));
4804                let res = err!(
4805                    self.builder
4806                        .build_int_truncate(res, self.intrinsics.i16x8_ty, "")
4807                );
4808                let res = err!(
4809                    self.builder
4810                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4811                );
4812                self.state.push1(res);
4813            }
4814
4815            Operator::F32Add => {
4820                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4821                let res = err!(self.builder.build_call(
4822                    self.intrinsics.add_f32,
4823                    &[
4824                        v1.into(),
4825                        v2.into(),
4826                        self.intrinsics.fp_rounding_md,
4827                        self.intrinsics.fp_exception_md,
4828                    ],
4829                    "",
4830                ))
4831                .try_as_basic_value()
4832                .left()
4833                .unwrap();
4834                self.state.push1_extra(
4835                    res,
4836                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f32_nan())?,
4837                );
4838            }
4839            Operator::F64Add => {
4840                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4841                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
4842                let res = err!(self.builder.build_call(
4843                    self.intrinsics.add_f64,
4844                    &[
4845                        v1.into(),
4846                        v2.into(),
4847                        self.intrinsics.fp_rounding_md,
4848                        self.intrinsics.fp_exception_md,
4849                    ],
4850                    "",
4851                ))
4852                .try_as_basic_value()
4853                .left()
4854                .unwrap();
4855                self.state.push1_extra(
4856                    res,
4857                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f64_nan())?,
4858                );
4859            }
4860            Operator::F32x4Add => {
4861                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4862                let (v1, i1) = self.v128_into_f32x4(v1, i1)?;
4863                let (v2, i2) = self.v128_into_f32x4(v2, i2)?;
4864                let res = err!(self.builder.build_call(
4865                    self.intrinsics.add_f32x4,
4866                    &[
4867                        v1.into(),
4868                        v2.into(),
4869                        self.intrinsics.fp_rounding_md,
4870                        self.intrinsics.fp_exception_md,
4871                    ],
4872                    "",
4873                ))
4874                .try_as_basic_value()
4875                .left()
4876                .unwrap();
4877                let res = err!(
4878                    self.builder
4879                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4880                );
4881                self.state.push1_extra(
4882                    res,
4883                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f32_nan())?,
4884                );
4885            }
4886            Operator::F64x2Add => {
4887                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4888                let (v1, i1) = self.v128_into_f64x2(v1, i1)?;
4889                let (v2, i2) = self.v128_into_f64x2(v2, i2)?;
4890                let res = err!(self.builder.build_call(
4891                    self.intrinsics.add_f64x2,
4892                    &[
4893                        v1.into(),
4894                        v2.into(),
4895                        self.intrinsics.fp_rounding_md,
4896                        self.intrinsics.fp_exception_md,
4897                    ],
4898                    "",
4899                ))
4900                .try_as_basic_value()
4901                .left()
4902                .unwrap();
4903                let res = err!(
4904                    self.builder
4905                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4906                );
4907                self.state.push1_extra(
4908                    res,
4909                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f64_nan())?,
4910                );
4911            }
4912            Operator::F32Sub => {
4913                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4914                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
4915                let res = err!(self.builder.build_call(
4916                    self.intrinsics.sub_f32,
4917                    &[
4918                        v1.into(),
4919                        v2.into(),
4920                        self.intrinsics.fp_rounding_md,
4921                        self.intrinsics.fp_exception_md,
4922                    ],
4923                    "",
4924                ))
4925                .try_as_basic_value()
4926                .left()
4927                .unwrap();
4928                self.state.push1_extra(
4929                    res,
4930                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f32_nan())?,
4931                );
4932            }
4933            Operator::F64Sub => {
4934                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4935                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
4936                let res = err!(self.builder.build_call(
4937                    self.intrinsics.sub_f64,
4938                    &[
4939                        v1.into(),
4940                        v2.into(),
4941                        self.intrinsics.fp_rounding_md,
4942                        self.intrinsics.fp_exception_md,
4943                    ],
4944                    "",
4945                ))
4946                .try_as_basic_value()
4947                .left()
4948                .unwrap();
4949                self.state.push1_extra(
4950                    res,
4951                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f64_nan())?,
4952                );
4953            }
4954            Operator::F32x4Sub => {
4955                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4956                let (v1, i1) = self.v128_into_f32x4(v1, i1)?;
4957                let (v2, i2) = self.v128_into_f32x4(v2, i2)?;
4958                let res = err!(self.builder.build_call(
4959                    self.intrinsics.sub_f32x4,
4960                    &[
4961                        v1.into(),
4962                        v2.into(),
4963                        self.intrinsics.fp_rounding_md,
4964                        self.intrinsics.fp_exception_md,
4965                    ],
4966                    "",
4967                ))
4968                .try_as_basic_value()
4969                .left()
4970                .unwrap();
4971                let res = err!(
4972                    self.builder
4973                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
4974                );
4975                self.state.push1_extra(
4976                    res,
4977                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f32_nan())?,
4978                );
4979            }
4980            Operator::F64x2Sub => {
4981                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
4982                let (v1, i1) = self.v128_into_f64x2(v1, i1)?;
4983                let (v2, i2) = self.v128_into_f64x2(v2, i2)?;
4984                let res = err!(self.builder.build_call(
4985                    self.intrinsics.sub_f64x2,
4986                    &[
4987                        v1.into(),
4988                        v2.into(),
4989                        self.intrinsics.fp_rounding_md,
4990                        self.intrinsics.fp_exception_md,
4991                    ],
4992                    "",
4993                ))
4994                .try_as_basic_value()
4995                .left()
4996                .unwrap();
4997                let res = err!(
4998                    self.builder
4999                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5000                );
5001                self.state.push1_extra(
5002                    res,
5003                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f64_nan())?,
5004                );
5005            }
5006            Operator::F32Mul => {
5007                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5008                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
5009                let res = err!(self.builder.build_call(
5010                    self.intrinsics.mul_f32,
5011                    &[
5012                        v1.into(),
5013                        v2.into(),
5014                        self.intrinsics.fp_rounding_md,
5015                        self.intrinsics.fp_exception_md,
5016                    ],
5017                    "",
5018                ))
5019                .try_as_basic_value()
5020                .left()
5021                .unwrap();
5022                self.state.push1_extra(
5023                    res,
5024                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f32_nan())?,
5025                );
5026            }
5027            Operator::F64Mul => {
5028                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5029                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
5030                let res = err!(self.builder.build_call(
5031                    self.intrinsics.mul_f64,
5032                    &[
5033                        v1.into(),
5034                        v2.into(),
5035                        self.intrinsics.fp_rounding_md,
5036                        self.intrinsics.fp_exception_md,
5037                    ],
5038                    "",
5039                ))
5040                .try_as_basic_value()
5041                .left()
5042                .unwrap();
5043                self.state.push1_extra(
5044                    res,
5045                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f64_nan())?,
5046                );
5047            }
5048            Operator::F32x4Mul => {
5049                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5050                let (v1, i1) = self.v128_into_f32x4(v1, i1)?;
5051                let (v2, i2) = self.v128_into_f32x4(v2, i2)?;
5052                let res = err!(self.builder.build_call(
5053                    self.intrinsics.mul_f32x4,
5054                    &[
5055                        v1.into(),
5056                        v2.into(),
5057                        self.intrinsics.fp_rounding_md,
5058                        self.intrinsics.fp_exception_md,
5059                    ],
5060                    "",
5061                ))
5062                .try_as_basic_value()
5063                .left()
5064                .unwrap();
5065                let res = err!(
5066                    self.builder
5067                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5068                );
5069                self.state.push1_extra(
5070                    res,
5071                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f32_nan())?,
5072                );
5073            }
5074            Operator::F64x2Mul => {
5075                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5076                let (v1, i1) = self.v128_into_f64x2(v1, i1)?;
5077                let (v2, i2) = self.v128_into_f64x2(v2, i2)?;
5078                let res = err!(self.builder.build_call(
5079                    self.intrinsics.mul_f64x2,
5080                    &[
5081                        v1.into(),
5082                        v2.into(),
5083                        self.intrinsics.fp_rounding_md,
5084                        self.intrinsics.fp_exception_md,
5085                    ],
5086                    "",
5087                ))
5088                .try_as_basic_value()
5089                .left()
5090                .unwrap();
5091                let res = err!(
5092                    self.builder
5093                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5094                );
5095                self.state.push1_extra(
5096                    res,
5097                    ((i1.strip_pending() & i2.strip_pending())? | ExtraInfo::pending_f64_nan())?,
5098                );
5099            }
5100            Operator::F32Div => {
5101                let (v1, v2) = self.state.pop2()?;
5102                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
5103                let res = err!(self.builder.build_call(
5104                    self.intrinsics.div_f32,
5105                    &[
5106                        v1.into(),
5107                        v2.into(),
5108                        self.intrinsics.fp_rounding_md,
5109                        self.intrinsics.fp_exception_md,
5110                    ],
5111                    "",
5112                ))
5113                .try_as_basic_value()
5114                .left()
5115                .unwrap();
5116                self.state.push1_extra(res, ExtraInfo::pending_f32_nan());
5117            }
5118            Operator::F64Div => {
5119                let (v1, v2) = self.state.pop2()?;
5120                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
5121                let res = err!(self.builder.build_call(
5122                    self.intrinsics.div_f64,
5123                    &[
5124                        v1.into(),
5125                        v2.into(),
5126                        self.intrinsics.fp_rounding_md,
5127                        self.intrinsics.fp_exception_md,
5128                    ],
5129                    "",
5130                ))
5131                .try_as_basic_value()
5132                .left()
5133                .unwrap();
5134                self.state.push1_extra(res, ExtraInfo::pending_f64_nan());
5135            }
5136            Operator::F32x4Div => {
5137                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5138                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
5139                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
5140                let res = err!(self.builder.build_call(
5141                    self.intrinsics.div_f32x4,
5142                    &[
5143                        v1.into(),
5144                        v2.into(),
5145                        self.intrinsics.fp_rounding_md,
5146                        self.intrinsics.fp_exception_md,
5147                    ],
5148                    "",
5149                ))
5150                .try_as_basic_value()
5151                .left()
5152                .unwrap();
5153                let res = err!(
5154                    self.builder
5155                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5156                );
5157                self.state.push1_extra(res, ExtraInfo::pending_f32_nan());
5158            }
5159            Operator::F64x2Div => {
5160                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5161                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
5162                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
5163                let res = err!(self.builder.build_call(
5164                    self.intrinsics.div_f64x2,
5165                    &[
5166                        v1.into(),
5167                        v2.into(),
5168                        self.intrinsics.fp_rounding_md,
5169                        self.intrinsics.fp_exception_md,
5170                    ],
5171                    "",
5172                ))
5173                .try_as_basic_value()
5174                .left()
5175                .unwrap();
5176                let res = err!(
5177                    self.builder
5178                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5179                );
5180                self.state.push1_extra(res, ExtraInfo::pending_f64_nan());
5181            }
5182            Operator::F32Sqrt => {
5183                let input = self.state.pop1()?;
5184                let res = err!(self.builder.build_call(
5185                    self.intrinsics.sqrt_f32,
5186                    &[input.into()],
5187                    ""
5188                ))
5189                .try_as_basic_value()
5190                .left()
5191                .unwrap();
5192                self.state.push1_extra(res, ExtraInfo::pending_f32_nan());
5193            }
5194            Operator::F64Sqrt => {
5195                let input = self.state.pop1()?;
5196                let res = err!(self.builder.build_call(
5197                    self.intrinsics.sqrt_f64,
5198                    &[input.into()],
5199                    ""
5200                ))
5201                .try_as_basic_value()
5202                .left()
5203                .unwrap();
5204                self.state.push1_extra(res, ExtraInfo::pending_f64_nan());
5205            }
5206            Operator::F32x4Sqrt => {
5207                let (v, i) = self.state.pop1_extra()?;
5208                let (v, _) = self.v128_into_f32x4(v, i)?;
5209                let res = err!(self.builder.build_call(
5210                    self.intrinsics.sqrt_f32x4,
5211                    &[v.into()],
5212                    ""
5213                ))
5214                .try_as_basic_value()
5215                .left()
5216                .unwrap();
5217                let bits = err!(
5218                    self.builder
5219                        .build_bit_cast(res, self.intrinsics.i128_ty, "bits")
5220                );
5221                self.state.push1_extra(bits, ExtraInfo::pending_f32_nan());
5222            }
5223            Operator::F64x2Sqrt => {
5224                let (v, i) = self.state.pop1_extra()?;
5225                let (v, _) = self.v128_into_f64x2(v, i)?;
5226                let res = err!(self.builder.build_call(
5227                    self.intrinsics.sqrt_f64x2,
5228                    &[v.into()],
5229                    ""
5230                ))
5231                .try_as_basic_value()
5232                .left()
5233                .unwrap();
5234                let bits = err!(
5235                    self.builder
5236                        .build_bit_cast(res, self.intrinsics.i128_ty, "bits")
5237                );
5238                self.state.push1(bits);
5239            }
5240            Operator::F32Min => {
5241                let (v1, v2) = self.state.pop2()?;
5245                let v1 = self.canonicalize_nans(v1)?;
5246                let v2 = self.canonicalize_nans(v2)?;
5247
5248                let v1_is_nan = err!(self.builder.build_call(
5249                    self.intrinsics.cmp_f32,
5250                    &[
5251                        v1.into(),
5252                        self.intrinsics.f32_zero.into(),
5253                        self.intrinsics.fp_uno_md,
5254                        self.intrinsics.fp_exception_md,
5255                    ],
5256                    "",
5257                ))
5258                .try_as_basic_value()
5259                .left()
5260                .unwrap()
5261                .into_int_value();
5262                let v2_is_nan = err!(self.builder.build_call(
5263                    self.intrinsics.cmp_f32,
5264                    &[
5265                        v2.into(),
5266                        self.intrinsics.f32_zero.into(),
5267                        self.intrinsics.fp_uno_md,
5268                        self.intrinsics.fp_exception_md,
5269                    ],
5270                    "",
5271                ))
5272                .try_as_basic_value()
5273                .left()
5274                .unwrap()
5275                .into_int_value();
5276                let v1_lt_v2 = err!(self.builder.build_call(
5277                    self.intrinsics.cmp_f32,
5278                    &[
5279                        v1.into(),
5280                        v2.into(),
5281                        self.intrinsics.fp_olt_md,
5282                        self.intrinsics.fp_exception_md,
5283                    ],
5284                    "",
5285                ))
5286                .try_as_basic_value()
5287                .left()
5288                .unwrap()
5289                .into_int_value();
5290                let v1_gt_v2 = err!(self.builder.build_call(
5291                    self.intrinsics.cmp_f32,
5292                    &[
5293                        v1.into(),
5294                        v2.into(),
5295                        self.intrinsics.fp_ogt_md,
5296                        self.intrinsics.fp_exception_md,
5297                    ],
5298                    "",
5299                ))
5300                .try_as_basic_value()
5301                .left()
5302                .unwrap()
5303                .into_int_value();
5304
5305                let res = err!(self.builder.build_select(
5306                    v1_is_nan,
5307                    self.quiet_nan(v1)?,
5308                    err!(self.builder.build_select(
5309                        v2_is_nan,
5310                        self.quiet_nan(v2)?,
5311                        err!(self.builder.build_select(
5312                            v1_lt_v2,
5313                            v1,
5314                            err!(self.builder.build_select(
5315                                v1_gt_v2,
5316                                v2,
5317                                err!(self.builder.build_bit_cast(
5318                                    err!(self.builder.build_or(
5319                                        err!(self.builder.build_bit_cast(
5320                                            v1,
5321                                            self.intrinsics.i32_ty,
5322                                            ""
5323                                        ))
5324                                        .into_int_value(),
5325                                        err!(self.builder.build_bit_cast(
5326                                            v2,
5327                                            self.intrinsics.i32_ty,
5328                                            ""
5329                                        ))
5330                                        .into_int_value(),
5331                                        "",
5332                                    )),
5333                                    self.intrinsics.f32_ty,
5334                                    "",
5335                                )),
5336                                "",
5337                            )),
5338                            "",
5339                        )),
5340                        "",
5341                    )),
5342                    "",
5343                ));
5344
5345                self.state.push1(res);
5346            }
5347            Operator::F64Min => {
5348                let (v1, v2) = self.state.pop2()?;
5352                let v1 = self.canonicalize_nans(v1)?;
5353                let v2 = self.canonicalize_nans(v2)?;
5354
5355                let v1_is_nan = err!(self.builder.build_call(
5356                    self.intrinsics.cmp_f64,
5357                    &[
5358                        v1.into(),
5359                        self.intrinsics.f64_zero.into(),
5360                        self.intrinsics.fp_uno_md,
5361                        self.intrinsics.fp_exception_md,
5362                    ],
5363                    "",
5364                ))
5365                .try_as_basic_value()
5366                .left()
5367                .unwrap()
5368                .into_int_value();
5369                let v2_is_nan = err!(self.builder.build_call(
5370                    self.intrinsics.cmp_f64,
5371                    &[
5372                        v2.into(),
5373                        self.intrinsics.f64_zero.into(),
5374                        self.intrinsics.fp_uno_md,
5375                        self.intrinsics.fp_exception_md,
5376                    ],
5377                    "",
5378                ))
5379                .try_as_basic_value()
5380                .left()
5381                .unwrap()
5382                .into_int_value();
5383                let v1_lt_v2 = err!(self.builder.build_call(
5384                    self.intrinsics.cmp_f64,
5385                    &[
5386                        v1.into(),
5387                        v2.into(),
5388                        self.intrinsics.fp_olt_md,
5389                        self.intrinsics.fp_exception_md,
5390                    ],
5391                    "",
5392                ))
5393                .try_as_basic_value()
5394                .left()
5395                .unwrap()
5396                .into_int_value();
5397                let v1_gt_v2 = err!(self.builder.build_call(
5398                    self.intrinsics.cmp_f64,
5399                    &[
5400                        v1.into(),
5401                        v2.into(),
5402                        self.intrinsics.fp_ogt_md,
5403                        self.intrinsics.fp_exception_md,
5404                    ],
5405                    "",
5406                ))
5407                .try_as_basic_value()
5408                .left()
5409                .unwrap()
5410                .into_int_value();
5411
5412                let res = err!(self.builder.build_select(
5413                    v1_is_nan,
5414                    self.quiet_nan(v1)?,
5415                    err!(self.builder.build_select(
5416                        v2_is_nan,
5417                        self.quiet_nan(v2)?,
5418                        err!(self.builder.build_select(
5419                            v1_lt_v2,
5420                            v1,
5421                            err!(self.builder.build_select(
5422                                v1_gt_v2,
5423                                v2,
5424                                err!(self.builder.build_bit_cast(
5425                                    err!(self.builder.build_or(
5426                                        err!(self.builder.build_bit_cast(
5427                                            v1,
5428                                            self.intrinsics.i64_ty,
5429                                            ""
5430                                        ))
5431                                        .into_int_value(),
5432                                        err!(self.builder.build_bit_cast(
5433                                            v2,
5434                                            self.intrinsics.i64_ty,
5435                                            ""
5436                                        ))
5437                                        .into_int_value(),
5438                                        "",
5439                                    )),
5440                                    self.intrinsics.f64_ty,
5441                                    "",
5442                                )),
5443                                "",
5444                            )),
5445                            "",
5446                        )),
5447                        "",
5448                    )),
5449                    "",
5450                ));
5451
5452                self.state.push1(res);
5453            }
5454            Operator::F32x4Min => {
5455                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5459                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
5460                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
5461
5462                let v1_is_nan = err!(self.builder.build_call(
5463                    self.intrinsics.cmp_f32x4,
5464                    &[
5465                        v1.into(),
5466                        self.intrinsics.f32x4_zero.into(),
5467                        self.intrinsics.fp_uno_md,
5468                        self.intrinsics.fp_exception_md,
5469                    ],
5470                    "",
5471                ))
5472                .try_as_basic_value()
5473                .left()
5474                .unwrap()
5475                .into_vector_value();
5476                let v2_is_nan = err!(self.builder.build_call(
5477                    self.intrinsics.cmp_f32x4,
5478                    &[
5479                        v2.into(),
5480                        self.intrinsics.f32x4_zero.into(),
5481                        self.intrinsics.fp_uno_md,
5482                        self.intrinsics.fp_exception_md,
5483                    ],
5484                    "",
5485                ))
5486                .try_as_basic_value()
5487                .left()
5488                .unwrap()
5489                .into_vector_value();
5490                let v1_lt_v2 = err!(self.builder.build_call(
5491                    self.intrinsics.cmp_f32x4,
5492                    &[
5493                        v1.into(),
5494                        v2.into(),
5495                        self.intrinsics.fp_olt_md,
5496                        self.intrinsics.fp_exception_md,
5497                    ],
5498                    "",
5499                ))
5500                .try_as_basic_value()
5501                .left()
5502                .unwrap()
5503                .into_vector_value();
5504                let v1_gt_v2 = err!(self.builder.build_call(
5505                    self.intrinsics.cmp_f32x4,
5506                    &[
5507                        v1.into(),
5508                        v2.into(),
5509                        self.intrinsics.fp_ogt_md,
5510                        self.intrinsics.fp_exception_md,
5511                    ],
5512                    "",
5513                ))
5514                .try_as_basic_value()
5515                .left()
5516                .unwrap()
5517                .into_vector_value();
5518
5519                let res = err!(
5520                    self.builder.build_select(
5521                        v1_is_nan,
5522                        self.quiet_nan(v1.into())?.into_vector_value(),
5523                        err!(
5524                            self.builder.build_select(
5525                                v2_is_nan,
5526                                self.quiet_nan(v2.into())?.into_vector_value(),
5527                                err!(self.builder.build_select(
5528                                    v1_lt_v2,
5529                                    v1.into(),
5530                                    err!(self.builder.build_select(
5531                                        v1_gt_v2,
5532                                        v2.into(),
5533                                        err!(self.builder.build_bit_cast(
5534                                            err!(self.builder.build_or(
5535                                        err!(self.builder.build_bit_cast(
5536                                            v1,
5537                                            self.intrinsics.i32x4_ty,
5538                                            "",
5539                                        ))
5540                                        .into_vector_value(),
5541                                        err!(self.builder.build_bit_cast(
5542                                            v2,
5543                                            self.intrinsics.i32x4_ty,
5544                                            "",
5545                                        ))
5546                                        .into_vector_value(),
5547                                        "",
5548                                    )),
5549                                            self.intrinsics.f32x4_ty,
5550                                            "",
5551                                        )),
5552                                        "",
5553                                    )),
5554                                    "",
5555                                ))
5556                                .into_vector_value(),
5557                                "",
5558                            )
5559                        )
5560                        .into_vector_value(),
5561                        "",
5562                    )
5563                );
5564
5565                let res = err!(
5566                    self.builder
5567                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5568                );
5569                self.state.push1(res);
5570            }
5571            Operator::F32x4PMin => {
5572                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5574                let (v1, _i1) = self.v128_into_f32x4(v1, i1)?;
5575                let (v2, _i2) = self.v128_into_f32x4(v2, i2)?;
5576                let cmp = err!(
5577                    self.builder
5578                        .build_float_compare(FloatPredicate::OLT, v2, v1, "")
5579                );
5580                let res = err!(self.builder.build_select(cmp, v2, v1, ""));
5581                let res = err!(
5582                    self.builder
5583                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5584                );
5585                self.state.push1(res);
5586            }
5587            Operator::F64x2Min => {
5588                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5592                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
5593                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
5594
5595                let v1_is_nan = err!(self.builder.build_call(
5596                    self.intrinsics.cmp_f64x2,
5597                    &[
5598                        v1.into(),
5599                        self.intrinsics.f64x2_zero.into(),
5600                        self.intrinsics.fp_uno_md,
5601                        self.intrinsics.fp_exception_md,
5602                    ],
5603                    "",
5604                ))
5605                .try_as_basic_value()
5606                .left()
5607                .unwrap()
5608                .into_vector_value();
5609                let v2_is_nan = err!(self.builder.build_call(
5610                    self.intrinsics.cmp_f64x2,
5611                    &[
5612                        v2.into(),
5613                        self.intrinsics.f64x2_zero.into(),
5614                        self.intrinsics.fp_uno_md,
5615                        self.intrinsics.fp_exception_md,
5616                    ],
5617                    "",
5618                ))
5619                .try_as_basic_value()
5620                .left()
5621                .unwrap()
5622                .into_vector_value();
5623                let v1_lt_v2 = err!(self.builder.build_call(
5624                    self.intrinsics.cmp_f64x2,
5625                    &[
5626                        v1.into(),
5627                        v2.into(),
5628                        self.intrinsics.fp_olt_md,
5629                        self.intrinsics.fp_exception_md,
5630                    ],
5631                    "",
5632                ))
5633                .try_as_basic_value()
5634                .left()
5635                .unwrap()
5636                .into_vector_value();
5637                let v1_gt_v2 = err!(self.builder.build_call(
5638                    self.intrinsics.cmp_f64x2,
5639                    &[
5640                        v1.into(),
5641                        v2.into(),
5642                        self.intrinsics.fp_ogt_md,
5643                        self.intrinsics.fp_exception_md,
5644                    ],
5645                    "",
5646                ))
5647                .try_as_basic_value()
5648                .left()
5649                .unwrap()
5650                .into_vector_value();
5651
5652                let res = err!(
5653                    self.builder.build_select(
5654                        v1_is_nan,
5655                        self.quiet_nan(v1.into())?.into_vector_value(),
5656                        err!(
5657                            self.builder.build_select(
5658                                v2_is_nan,
5659                                self.quiet_nan(v2.into())?.into_vector_value(),
5660                                err!(self.builder.build_select(
5661                                    v1_lt_v2,
5662                                    v1.into(),
5663                                    err!(self.builder.build_select(
5664                                        v1_gt_v2,
5665                                        v2.into(),
5666                                        err!(self.builder.build_bit_cast(
5667                                            err!(self.builder.build_or(
5668                                        err!(self.builder.build_bit_cast(
5669                                            v1,
5670                                            self.intrinsics.i64x2_ty,
5671                                            "",
5672                                        ))
5673                                        .into_vector_value(),
5674                                        err!(self.builder.build_bit_cast(
5675                                            v2,
5676                                            self.intrinsics.i64x2_ty,
5677                                            "",
5678                                        ))
5679                                        .into_vector_value(),
5680                                        "",
5681                                    )),
5682                                            self.intrinsics.f64x2_ty,
5683                                            "",
5684                                        )),
5685                                        "",
5686                                    )),
5687                                    "",
5688                                ))
5689                                .into_vector_value(),
5690                                "",
5691                            )
5692                        )
5693                        .into_vector_value(),
5694                        "",
5695                    )
5696                );
5697
5698                let res = err!(
5699                    self.builder
5700                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5701                );
5702                self.state.push1(res);
5703            }
5704            Operator::F64x2PMin => {
5705                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5707                let (v1, _i1) = self.v128_into_f64x2(v1, i1)?;
5708                let (v2, _i2) = self.v128_into_f64x2(v2, i2)?;
5709                let cmp = err!(
5710                    self.builder
5711                        .build_float_compare(FloatPredicate::OLT, v2, v1, "")
5712                );
5713                let res = err!(self.builder.build_select(cmp, v2, v1, ""));
5714                let res = err!(
5715                    self.builder
5716                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
5717                );
5718                self.state.push1(res);
5719            }
5720            Operator::F32Max => {
5721                let (v1, v2) = self.state.pop2()?;
5725                let v1 = self.canonicalize_nans(v1)?;
5726                let v2 = self.canonicalize_nans(v2)?;
5727
5728                let v1_is_nan = err!(self.builder.build_call(
5729                    self.intrinsics.cmp_f32,
5730                    &[
5731                        v1.into(),
5732                        self.intrinsics.f32_zero.into(),
5733                        self.intrinsics.fp_uno_md,
5734                        self.intrinsics.fp_exception_md,
5735                    ],
5736                    "",
5737                ))
5738                .try_as_basic_value()
5739                .left()
5740                .unwrap()
5741                .into_int_value();
5742                let v2_is_nan = err!(self.builder.build_call(
5743                    self.intrinsics.cmp_f32,
5744                    &[
5745                        v2.into(),
5746                        self.intrinsics.f32_zero.into(),
5747                        self.intrinsics.fp_uno_md,
5748                        self.intrinsics.fp_exception_md,
5749                    ],
5750                    "",
5751                ))
5752                .try_as_basic_value()
5753                .left()
5754                .unwrap()
5755                .into_int_value();
5756                let v1_lt_v2 = err!(self.builder.build_call(
5757                    self.intrinsics.cmp_f32,
5758                    &[
5759                        v1.into(),
5760                        v2.into(),
5761                        self.intrinsics.fp_olt_md,
5762                        self.intrinsics.fp_exception_md,
5763                    ],
5764                    "",
5765                ))
5766                .try_as_basic_value()
5767                .left()
5768                .unwrap()
5769                .into_int_value();
5770                let v1_gt_v2 = err!(self.builder.build_call(
5771                    self.intrinsics.cmp_f32,
5772                    &[
5773                        v1.into(),
5774                        v2.into(),
5775                        self.intrinsics.fp_ogt_md,
5776                        self.intrinsics.fp_exception_md,
5777                    ],
5778                    "",
5779                ))
5780                .try_as_basic_value()
5781                .left()
5782                .unwrap()
5783                .into_int_value();
5784
5785                let res = err!(self.builder.build_select(
5786                    v1_is_nan,
5787                    self.quiet_nan(v1)?,
5788                    err!(self.builder.build_select(
5789                        v2_is_nan,
5790                        self.quiet_nan(v2)?,
5791                        err!(self.builder.build_select(
5792                            v1_lt_v2,
5793                            v2,
5794                            err!(self.builder.build_select(
5795                                v1_gt_v2,
5796                                v1,
5797                                err!(self.builder.build_bit_cast(
5798                                    err!(self.builder.build_and(
5799                                        err!(self.builder.build_bit_cast(
5800                                            v1,
5801                                            self.intrinsics.i32_ty,
5802                                            ""
5803                                        ))
5804                                        .into_int_value(),
5805                                        err!(self.builder.build_bit_cast(
5806                                            v2,
5807                                            self.intrinsics.i32_ty,
5808                                            ""
5809                                        ))
5810                                        .into_int_value(),
5811                                        "",
5812                                    )),
5813                                    self.intrinsics.f32_ty,
5814                                    "",
5815                                )),
5816                                "",
5817                            )),
5818                            "",
5819                        )),
5820                        "",
5821                    )),
5822                    "",
5823                ));
5824
5825                self.state.push1(res);
5826            }
5827            Operator::F64Max => {
5828                let (v1, v2) = self.state.pop2()?;
5832                let v1 = self.canonicalize_nans(v1)?;
5833                let v2 = self.canonicalize_nans(v2)?;
5834
5835                let v1_is_nan = err!(self.builder.build_call(
5836                    self.intrinsics.cmp_f64,
5837                    &[
5838                        v1.into(),
5839                        self.intrinsics.f64_zero.into(),
5840                        self.intrinsics.fp_uno_md,
5841                        self.intrinsics.fp_exception_md,
5842                    ],
5843                    "",
5844                ))
5845                .try_as_basic_value()
5846                .left()
5847                .unwrap()
5848                .into_int_value();
5849                let v2_is_nan = err!(self.builder.build_call(
5850                    self.intrinsics.cmp_f64,
5851                    &[
5852                        v2.into(),
5853                        self.intrinsics.f64_zero.into(),
5854                        self.intrinsics.fp_uno_md,
5855                        self.intrinsics.fp_exception_md,
5856                    ],
5857                    "",
5858                ))
5859                .try_as_basic_value()
5860                .left()
5861                .unwrap()
5862                .into_int_value();
5863                let v1_lt_v2 = err!(self.builder.build_call(
5864                    self.intrinsics.cmp_f64,
5865                    &[
5866                        v1.into(),
5867                        v2.into(),
5868                        self.intrinsics.fp_olt_md,
5869                        self.intrinsics.fp_exception_md,
5870                    ],
5871                    "",
5872                ))
5873                .try_as_basic_value()
5874                .left()
5875                .unwrap()
5876                .into_int_value();
5877                let v1_gt_v2 = err!(self.builder.build_call(
5878                    self.intrinsics.cmp_f64,
5879                    &[
5880                        v1.into(),
5881                        v2.into(),
5882                        self.intrinsics.fp_ogt_md,
5883                        self.intrinsics.fp_exception_md,
5884                    ],
5885                    "",
5886                ))
5887                .try_as_basic_value()
5888                .left()
5889                .unwrap()
5890                .into_int_value();
5891
5892                let res = err!(self.builder.build_select(
5893                    v1_is_nan,
5894                    self.quiet_nan(v1)?,
5895                    err!(self.builder.build_select(
5896                        v2_is_nan,
5897                        self.quiet_nan(v2)?,
5898                        err!(self.builder.build_select(
5899                            v1_lt_v2,
5900                            v2,
5901                            err!(self.builder.build_select(
5902                                v1_gt_v2,
5903                                v1,
5904                                err!(self.builder.build_bit_cast(
5905                                    err!(self.builder.build_and(
5906                                        err!(self.builder.build_bit_cast(
5907                                            v1,
5908                                            self.intrinsics.i64_ty,
5909                                            ""
5910                                        ))
5911                                        .into_int_value(),
5912                                        err!(self.builder.build_bit_cast(
5913                                            v2,
5914                                            self.intrinsics.i64_ty,
5915                                            ""
5916                                        ))
5917                                        .into_int_value(),
5918                                        "",
5919                                    )),
5920                                    self.intrinsics.f64_ty,
5921                                    "",
5922                                )),
5923                                "",
5924                            )),
5925                            "",
5926                        )),
5927                        "",
5928                    )),
5929                    "",
5930                ));
5931
5932                self.state.push1(res);
5933            }
5934            Operator::F32x4Max => {
5935                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
5939                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
5940                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
5941
5942                let v1_is_nan = err!(self.builder.build_call(
5943                    self.intrinsics.cmp_f32x4,
5944                    &[
5945                        v1.into(),
5946                        self.intrinsics.f32x4_zero.into(),
5947                        self.intrinsics.fp_uno_md,
5948                        self.intrinsics.fp_exception_md,
5949                    ],
5950                    "",
5951                ))
5952                .try_as_basic_value()
5953                .left()
5954                .unwrap()
5955                .into_vector_value();
5956                let v2_is_nan = err!(self.builder.build_call(
5957                    self.intrinsics.cmp_f32x4,
5958                    &[
5959                        v2.into(),
5960                        self.intrinsics.f32x4_zero.into(),
5961                        self.intrinsics.fp_uno_md,
5962                        self.intrinsics.fp_exception_md,
5963                    ],
5964                    "",
5965                ))
5966                .try_as_basic_value()
5967                .left()
5968                .unwrap()
5969                .into_vector_value();
5970                let v1_lt_v2 = err!(self.builder.build_call(
5971                    self.intrinsics.cmp_f32x4,
5972                    &[
5973                        v1.into(),
5974                        v2.into(),
5975                        self.intrinsics.fp_olt_md,
5976                        self.intrinsics.fp_exception_md,
5977                    ],
5978                    "",
5979                ))
5980                .try_as_basic_value()
5981                .left()
5982                .unwrap()
5983                .into_vector_value();
5984                let v1_gt_v2 = err!(self.builder.build_call(
5985                    self.intrinsics.cmp_f32x4,
5986                    &[
5987                        v1.into(),
5988                        v2.into(),
5989                        self.intrinsics.fp_ogt_md,
5990                        self.intrinsics.fp_exception_md,
5991                    ],
5992                    "",
5993                ))
5994                .try_as_basic_value()
5995                .left()
5996                .unwrap()
5997                .into_vector_value();
5998
5999                let res = err!(
6000                    self.builder.build_select(
6001                        v1_is_nan,
6002                        self.quiet_nan(v1.into())?.into_vector_value(),
6003                        err!(
6004                            self.builder.build_select(
6005                                v2_is_nan,
6006                                self.quiet_nan(v2.into())?.into_vector_value(),
6007                                err!(self.builder.build_select(
6008                                    v1_lt_v2,
6009                                    v2.into(),
6010                                    err!(self.builder.build_select(
6011                                        v1_gt_v2,
6012                                        v1.into(),
6013                                        err!(self.builder.build_bit_cast(
6014                                            err!(self.builder.build_and(
6015                                        err!(self.builder.build_bit_cast(
6016                                            v1,
6017                                            self.intrinsics.i32x4_ty,
6018                                            "",
6019                                        ))
6020                                        .into_vector_value(),
6021                                        err!(self.builder.build_bit_cast(
6022                                            v2,
6023                                            self.intrinsics.i32x4_ty,
6024                                            "",
6025                                        ))
6026                                        .into_vector_value(),
6027                                        "",
6028                                    )),
6029                                            self.intrinsics.f32x4_ty,
6030                                            "",
6031                                        )),
6032                                        "",
6033                                    )),
6034                                    "",
6035                                ))
6036                                .into_vector_value(),
6037                                "",
6038                            )
6039                        )
6040                        .into_vector_value(),
6041                        "",
6042                    )
6043                );
6044
6045                let res = err!(
6046                    self.builder
6047                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6048                );
6049                self.state.push1(res);
6050            }
6051            Operator::F32x4PMax => {
6052                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6054                let (v1, _i1) = self.v128_into_f32x4(v1, i1)?;
6055                let (v2, _i2) = self.v128_into_f32x4(v2, i2)?;
6056                let cmp = err!(
6057                    self.builder
6058                        .build_float_compare(FloatPredicate::OLT, v1, v2, "")
6059                );
6060                let res = err!(self.builder.build_select(cmp, v2, v1, ""));
6061
6062                let res = err!(
6063                    self.builder
6064                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6065                );
6066                self.state.push1(res);
6067            }
6068            Operator::F64x2Max => {
6069                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6073                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
6074                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
6075
6076                let v1_is_nan = err!(self.builder.build_call(
6077                    self.intrinsics.cmp_f64x2,
6078                    &[
6079                        v1.into(),
6080                        self.intrinsics.f64x2_zero.into(),
6081                        self.intrinsics.fp_uno_md,
6082                        self.intrinsics.fp_exception_md,
6083                    ],
6084                    "",
6085                ))
6086                .try_as_basic_value()
6087                .left()
6088                .unwrap()
6089                .into_vector_value();
6090                let v2_is_nan = err!(self.builder.build_call(
6091                    self.intrinsics.cmp_f64x2,
6092                    &[
6093                        v2.into(),
6094                        self.intrinsics.f64x2_zero.into(),
6095                        self.intrinsics.fp_uno_md,
6096                        self.intrinsics.fp_exception_md,
6097                    ],
6098                    "",
6099                ))
6100                .try_as_basic_value()
6101                .left()
6102                .unwrap()
6103                .into_vector_value();
6104                let v1_lt_v2 = err!(self.builder.build_call(
6105                    self.intrinsics.cmp_f64x2,
6106                    &[
6107                        v1.into(),
6108                        v2.into(),
6109                        self.intrinsics.fp_olt_md,
6110                        self.intrinsics.fp_exception_md,
6111                    ],
6112                    "",
6113                ))
6114                .try_as_basic_value()
6115                .left()
6116                .unwrap()
6117                .into_vector_value();
6118                let v1_gt_v2 = err!(self.builder.build_call(
6119                    self.intrinsics.cmp_f64x2,
6120                    &[
6121                        v1.into(),
6122                        v2.into(),
6123                        self.intrinsics.fp_ogt_md,
6124                        self.intrinsics.fp_exception_md,
6125                    ],
6126                    "",
6127                ))
6128                .try_as_basic_value()
6129                .left()
6130                .unwrap()
6131                .into_vector_value();
6132
6133                let res = err!(
6134                    self.builder.build_select(
6135                        v1_is_nan,
6136                        self.quiet_nan(v1.into())?.into_vector_value(),
6137                        err!(
6138                            self.builder.build_select(
6139                                v2_is_nan,
6140                                self.quiet_nan(v2.into())?.into_vector_value(),
6141                                err!(self.builder.build_select(
6142                                    v1_lt_v2,
6143                                    v2.into(),
6144                                    err!(self.builder.build_select(
6145                                        v1_gt_v2,
6146                                        v1.into(),
6147                                        err!(self.builder.build_bit_cast(
6148                                            err!(self.builder.build_and(
6149                                        err!(self.builder.build_bit_cast(
6150                                            v1,
6151                                            self.intrinsics.i64x2_ty,
6152                                            "",
6153                                        ))
6154                                        .into_vector_value(),
6155                                        err!(self.builder.build_bit_cast(
6156                                            v2,
6157                                            self.intrinsics.i64x2_ty,
6158                                            "",
6159                                        ))
6160                                        .into_vector_value(),
6161                                        "",
6162                                    )),
6163                                            self.intrinsics.f64x2_ty,
6164                                            "",
6165                                        )),
6166                                        "",
6167                                    )),
6168                                    "",
6169                                ))
6170                                .into_vector_value(),
6171                                "",
6172                            )
6173                        )
6174                        .into_vector_value(),
6175                        "",
6176                    )
6177                );
6178
6179                let res = err!(
6180                    self.builder
6181                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6182                );
6183                self.state.push1(res);
6184            }
6185            Operator::F64x2PMax => {
6186                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6188                let (v1, _i1) = self.v128_into_f64x2(v1, i1)?;
6189                let (v2, _i2) = self.v128_into_f64x2(v2, i2)?;
6190                let cmp = err!(
6191                    self.builder
6192                        .build_float_compare(FloatPredicate::OLT, v1, v2, "")
6193                );
6194                let res = err!(self.builder.build_select(cmp, v2, v1, ""));
6195                let res = err!(
6196                    self.builder
6197                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6198                );
6199                self.state.push1(res);
6200            }
6201            Operator::F32Ceil => {
6202                let (input, info) = self.state.pop1_extra()?;
6203                let res = err!(self.builder.build_call(
6204                    self.intrinsics.ceil_f32,
6205                    &[input.into()],
6206                    ""
6207                ))
6208                .try_as_basic_value()
6209                .left()
6210                .unwrap();
6211                self.state
6212                    .push1_extra(res, (info | ExtraInfo::pending_f32_nan())?);
6213            }
6214            Operator::F32x4Ceil => {
6215                let (v, i) = self.state.pop1_extra()?;
6216                let (v, _) = self.v128_into_f32x4(v, i)?;
6217                let res = err!(self.builder.build_call(
6218                    self.intrinsics.ceil_f32x4,
6219                    &[v.into()],
6220                    ""
6221                ))
6222                .try_as_basic_value()
6223                .left()
6224                .unwrap();
6225                let res = err!(
6226                    self.builder
6227                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6228                );
6229                self.state
6230                    .push1_extra(res, (i | ExtraInfo::pending_f32_nan())?);
6231            }
6232            Operator::F64Ceil => {
6233                let (input, info) = self.state.pop1_extra()?;
6234                let res = err!(self.builder.build_call(
6235                    self.intrinsics.ceil_f64,
6236                    &[input.into()],
6237                    ""
6238                ))
6239                .try_as_basic_value()
6240                .left()
6241                .unwrap();
6242                self.state
6243                    .push1_extra(res, (info | ExtraInfo::pending_f64_nan())?);
6244            }
6245            Operator::F64x2Ceil => {
6246                let (v, i) = self.state.pop1_extra()?;
6247                let (v, _) = self.v128_into_f64x2(v, i)?;
6248                let res = err!(self.builder.build_call(
6249                    self.intrinsics.ceil_f64x2,
6250                    &[v.into()],
6251                    ""
6252                ))
6253                .try_as_basic_value()
6254                .left()
6255                .unwrap();
6256                let res = err!(
6257                    self.builder
6258                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6259                );
6260                self.state
6261                    .push1_extra(res, (i | ExtraInfo::pending_f64_nan())?);
6262            }
6263            Operator::F32Floor => {
6264                let (input, info) = self.state.pop1_extra()?;
6265                let res = err!(self.builder.build_call(
6266                    self.intrinsics.floor_f32,
6267                    &[input.into()],
6268                    ""
6269                ))
6270                .try_as_basic_value()
6271                .left()
6272                .unwrap();
6273                self.state
6274                    .push1_extra(res, (info | ExtraInfo::pending_f32_nan())?);
6275            }
6276            Operator::F32x4Floor => {
6277                let (v, i) = self.state.pop1_extra()?;
6278                let (v, _) = self.v128_into_f32x4(v, i)?;
6279                let res = err!(self.builder.build_call(
6280                    self.intrinsics.floor_f32x4,
6281                    &[v.into()],
6282                    ""
6283                ))
6284                .try_as_basic_value()
6285                .left()
6286                .unwrap();
6287                let res = err!(
6288                    self.builder
6289                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6290                );
6291                self.state
6292                    .push1_extra(res, (i | ExtraInfo::pending_f32_nan())?);
6293            }
6294            Operator::F64Floor => {
6295                let (input, info) = self.state.pop1_extra()?;
6296                let res = err!(self.builder.build_call(
6297                    self.intrinsics.floor_f64,
6298                    &[input.into()],
6299                    ""
6300                ))
6301                .try_as_basic_value()
6302                .left()
6303                .unwrap();
6304                self.state
6305                    .push1_extra(res, (info | ExtraInfo::pending_f64_nan())?);
6306            }
6307            Operator::F64x2Floor => {
6308                let (v, i) = self.state.pop1_extra()?;
6309                let (v, _) = self.v128_into_f64x2(v, i)?;
6310                let res = err!(self.builder.build_call(
6311                    self.intrinsics.floor_f64x2,
6312                    &[v.into()],
6313                    ""
6314                ))
6315                .try_as_basic_value()
6316                .left()
6317                .unwrap();
6318                let res = err!(
6319                    self.builder
6320                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6321                );
6322                self.state
6323                    .push1_extra(res, (i | ExtraInfo::pending_f64_nan())?);
6324            }
6325            Operator::F32Trunc => {
6326                let (v, i) = self.state.pop1_extra()?;
6327                let res = err!(
6328                    self.builder
6329                        .build_call(self.intrinsics.trunc_f32, &[v.into()], "")
6330                )
6331                .try_as_basic_value()
6332                .left()
6333                .unwrap();
6334                self.state
6335                    .push1_extra(res, (i | ExtraInfo::pending_f32_nan())?);
6336            }
6337            Operator::F32x4Trunc => {
6338                let (v, i) = self.state.pop1_extra()?;
6339                let (v, _) = self.v128_into_f32x4(v, i)?;
6340                let res = err!(self.builder.build_call(
6341                    self.intrinsics.trunc_f32x4,
6342                    &[v.into()],
6343                    ""
6344                ))
6345                .try_as_basic_value()
6346                .left()
6347                .unwrap();
6348                let res = err!(
6349                    self.builder
6350                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6351                );
6352                self.state
6353                    .push1_extra(res, (i | ExtraInfo::pending_f32_nan())?);
6354            }
6355            Operator::F64Trunc => {
6356                let (v, i) = self.state.pop1_extra()?;
6357                let res = err!(
6358                    self.builder
6359                        .build_call(self.intrinsics.trunc_f64, &[v.into()], "")
6360                )
6361                .try_as_basic_value()
6362                .left()
6363                .unwrap();
6364                self.state
6365                    .push1_extra(res, (i | ExtraInfo::pending_f64_nan())?);
6366            }
6367            Operator::F64x2Trunc => {
6368                let (v, i) = self.state.pop1_extra()?;
6369                let (v, _) = self.v128_into_f64x2(v, i)?;
6370                let res = err!(self.builder.build_call(
6371                    self.intrinsics.trunc_f64x2,
6372                    &[v.into()],
6373                    ""
6374                ))
6375                .try_as_basic_value()
6376                .left()
6377                .unwrap();
6378                let res = err!(
6379                    self.builder
6380                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6381                );
6382                self.state
6383                    .push1_extra(res, (i | ExtraInfo::pending_f64_nan())?);
6384            }
6385            Operator::F32Nearest => {
6386                let (v, i) = self.state.pop1_extra()?;
6387                let res = err!(self.builder.build_call(
6388                    self.intrinsics.nearbyint_f32,
6389                    &[v.into()],
6390                    ""
6391                ))
6392                .try_as_basic_value()
6393                .left()
6394                .unwrap();
6395                self.state
6396                    .push1_extra(res, (i | ExtraInfo::pending_f32_nan())?);
6397            }
6398            Operator::F32x4Nearest => {
6399                let (v, i) = self.state.pop1_extra()?;
6400                let (v, _) = self.v128_into_f32x4(v, i)?;
6401                let res = err!(self.builder.build_call(
6402                    self.intrinsics.nearbyint_f32x4,
6403                    &[v.into()],
6404                    ""
6405                ))
6406                .try_as_basic_value()
6407                .left()
6408                .unwrap();
6409                let res = err!(
6410                    self.builder
6411                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6412                );
6413                self.state
6414                    .push1_extra(res, (i | ExtraInfo::pending_f32_nan())?);
6415            }
6416            Operator::F64Nearest => {
6417                let (v, i) = self.state.pop1_extra()?;
6418                let res = err!(self.builder.build_call(
6419                    self.intrinsics.nearbyint_f64,
6420                    &[v.into()],
6421                    ""
6422                ))
6423                .try_as_basic_value()
6424                .left()
6425                .unwrap();
6426                self.state
6427                    .push1_extra(res, (i | ExtraInfo::pending_f64_nan())?);
6428            }
6429            Operator::F64x2Nearest => {
6430                let (v, i) = self.state.pop1_extra()?;
6431                let (v, _) = self.v128_into_f64x2(v, i)?;
6432                let res = err!(self.builder.build_call(
6433                    self.intrinsics.nearbyint_f64x2,
6434                    &[v.into()],
6435                    ""
6436                ))
6437                .try_as_basic_value()
6438                .left()
6439                .unwrap();
6440                let res = err!(
6441                    self.builder
6442                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6443                );
6444                self.state
6445                    .push1_extra(res, (i | ExtraInfo::pending_f64_nan())?);
6446            }
6447            Operator::F32Abs => {
6448                let (v, i) = self.state.pop1_extra()?;
6449                let v = self.apply_pending_canonicalization(v, i)?;
6450                let res = err!(
6451                    self.builder
6452                        .build_call(self.intrinsics.fabs_f32, &[v.into()], "")
6453                )
6454                .try_as_basic_value()
6455                .left()
6456                .unwrap();
6457                self.state.push1_extra(res, i.strip_pending());
6460            }
6461            Operator::F64Abs => {
6462                let (v, i) = self.state.pop1_extra()?;
6463                let v = self.apply_pending_canonicalization(v, i)?;
6464                let res = err!(
6465                    self.builder
6466                        .build_call(self.intrinsics.fabs_f64, &[v.into()], "")
6467                )
6468                .try_as_basic_value()
6469                .left()
6470                .unwrap();
6471                self.state.push1_extra(res, i.strip_pending());
6474            }
6475            Operator::F32x4Abs => {
6476                let (v, i) = self.state.pop1_extra()?;
6477                let v = err!(self.builder.build_bit_cast(
6478                    v.into_int_value(),
6479                    self.intrinsics.f32x4_ty,
6480                    ""
6481                ));
6482                let v = self.apply_pending_canonicalization(v, i)?;
6483                let res = err!(self.builder.build_call(
6484                    self.intrinsics.fabs_f32x4,
6485                    &[v.into()],
6486                    ""
6487                ))
6488                .try_as_basic_value()
6489                .left()
6490                .unwrap();
6491                let res = err!(
6492                    self.builder
6493                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6494                );
6495                self.state.push1_extra(res, i.strip_pending());
6498            }
6499            Operator::F64x2Abs => {
6500                let (v, i) = self.state.pop1_extra()?;
6501                let v = err!(self.builder.build_bit_cast(
6502                    v.into_int_value(),
6503                    self.intrinsics.f64x2_ty,
6504                    ""
6505                ));
6506                let v = self.apply_pending_canonicalization(v, i)?;
6507                let res = err!(self.builder.build_call(
6508                    self.intrinsics.fabs_f64x2,
6509                    &[v.into()],
6510                    ""
6511                ))
6512                .try_as_basic_value()
6513                .left()
6514                .unwrap();
6515                let res = err!(
6516                    self.builder
6517                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6518                );
6519                self.state.push1_extra(res, i.strip_pending());
6522            }
6523            Operator::F32x4Neg => {
6524                let (v, i) = self.state.pop1_extra()?;
6525                let v = err!(self.builder.build_bit_cast(
6526                    v.into_int_value(),
6527                    self.intrinsics.f32x4_ty,
6528                    ""
6529                ));
6530                let v = self
6531                    .apply_pending_canonicalization(v, i)?
6532                    .into_vector_value();
6533                let res = err!(self.builder.build_float_neg(v, ""));
6534                let res = err!(
6535                    self.builder
6536                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6537                );
6538                self.state.push1_extra(res, i.strip_pending());
6541            }
6542            Operator::F64x2Neg => {
6543                let (v, i) = self.state.pop1_extra()?;
6544                let v = err!(self.builder.build_bit_cast(
6545                    v.into_int_value(),
6546                    self.intrinsics.f64x2_ty,
6547                    ""
6548                ));
6549                let v = self
6550                    .apply_pending_canonicalization(v, i)?
6551                    .into_vector_value();
6552                let res = err!(self.builder.build_float_neg(v, ""));
6553                let res = err!(
6554                    self.builder
6555                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6556                );
6557                self.state.push1_extra(res, i.strip_pending());
6560            }
6561            Operator::F32Neg | Operator::F64Neg => {
6562                let (v, i) = self.state.pop1_extra()?;
6563                let v = self
6564                    .apply_pending_canonicalization(v, i)?
6565                    .into_float_value();
6566                let res = err!(self.builder.build_float_neg(v, ""));
6567                self.state.push1_extra(res, i.strip_pending());
6570            }
6571            Operator::F32Copysign => {
6572                let ((mag, mag_info), (sgn, sgn_info)) = self.state.pop2_extra()?;
6573                let mag = self.apply_pending_canonicalization(mag, mag_info)?;
6574                let sgn = self.apply_pending_canonicalization(sgn, sgn_info)?;
6575                let res = err!(self.builder.build_call(
6576                    self.intrinsics.copysign_f32,
6577                    &[mag.into(), sgn.into()],
6578                    ""
6579                ))
6580                .try_as_basic_value()
6581                .left()
6582                .unwrap();
6583                self.state.push1_extra(res, mag_info.strip_pending());
6586            }
6587            Operator::F64Copysign => {
6588                let ((mag, mag_info), (sgn, sgn_info)) = self.state.pop2_extra()?;
6589                let mag = self.apply_pending_canonicalization(mag, mag_info)?;
6590                let sgn = self.apply_pending_canonicalization(sgn, sgn_info)?;
6591                let res = err!(self.builder.build_call(
6592                    self.intrinsics.copysign_f64,
6593                    &[mag.into(), sgn.into()],
6594                    ""
6595                ))
6596                .try_as_basic_value()
6597                .left()
6598                .unwrap();
6599                self.state.push1_extra(res, mag_info.strip_pending());
6602            }
6603
6604            Operator::I32Eq | Operator::I64Eq => {
6609                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6610                let v1 = self.apply_pending_canonicalization(v1, i1)?;
6611                let v2 = self.apply_pending_canonicalization(v2, i2)?;
6612                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
6613                let cond = err!(self.builder.build_int_compare(IntPredicate::EQ, v1, v2, ""));
6614                let res = err!(
6615                    self.builder
6616                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
6617                );
6618                self.state.push1_extra(
6619                    res,
6620                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
6621                );
6622            }
6623            Operator::I8x16Eq => {
6624                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6625                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
6626                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
6627                let res = err!(self.builder.build_int_compare(IntPredicate::EQ, v1, v2, ""));
6628                let res = err!(
6629                    self.builder
6630                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
6631                );
6632                let res = err!(
6633                    self.builder
6634                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6635                );
6636                self.state.push1(res);
6637            }
6638            Operator::I16x8Eq => {
6639                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6640                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
6641                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
6642                let res = err!(self.builder.build_int_compare(IntPredicate::EQ, v1, v2, ""));
6643                let res = err!(
6644                    self.builder
6645                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
6646                );
6647                let res = err!(
6648                    self.builder
6649                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6650                );
6651                self.state.push1(res);
6652            }
6653            Operator::I32x4Eq => {
6654                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6655                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
6656                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
6657                let res = err!(self.builder.build_int_compare(IntPredicate::EQ, v1, v2, ""));
6658                let res = err!(
6659                    self.builder
6660                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
6661                );
6662                let res = err!(
6663                    self.builder
6664                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6665                );
6666                self.state.push1(res);
6667            }
6668            Operator::I64x2Eq => {
6669                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6670                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
6671                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
6672                let res = err!(self.builder.build_int_compare(IntPredicate::EQ, v1, v2, ""));
6673                let res = err!(
6674                    self.builder
6675                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
6676                );
6677                let res = err!(
6678                    self.builder
6679                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6680                );
6681                self.state.push1(res);
6682            }
6683            Operator::I32Ne | Operator::I64Ne => {
6684                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6685                let v1 = self.apply_pending_canonicalization(v1, i1)?;
6686                let v2 = self.apply_pending_canonicalization(v2, i2)?;
6687                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
6688                let cond = err!(self.builder.build_int_compare(IntPredicate::NE, v1, v2, ""));
6689                let res = err!(
6690                    self.builder
6691                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
6692                );
6693                self.state.push1_extra(
6694                    res,
6695                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
6696                );
6697            }
6698            Operator::I8x16Ne => {
6699                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6700                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
6701                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
6702                let res = err!(self.builder.build_int_compare(IntPredicate::NE, v1, v2, ""));
6703                let res = err!(
6704                    self.builder
6705                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
6706                );
6707                let res = err!(
6708                    self.builder
6709                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6710                );
6711                self.state.push1(res);
6712            }
6713            Operator::I16x8Ne => {
6714                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6715                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
6716                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
6717                let res = err!(self.builder.build_int_compare(IntPredicate::NE, v1, v2, ""));
6718                let res = err!(
6719                    self.builder
6720                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
6721                );
6722                let res = err!(
6723                    self.builder
6724                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6725                );
6726                self.state.push1(res);
6727            }
6728            Operator::I32x4Ne => {
6729                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6730                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
6731                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
6732                let res = err!(self.builder.build_int_compare(IntPredicate::NE, v1, v2, ""));
6733                let res = err!(
6734                    self.builder
6735                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
6736                );
6737                let res = err!(
6738                    self.builder
6739                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6740                );
6741                self.state.push1(res);
6742            }
6743            Operator::I64x2Ne => {
6744                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6745                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
6746                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
6747                let res = err!(self.builder.build_int_compare(IntPredicate::NE, v1, v2, ""));
6748                let res = err!(
6749                    self.builder
6750                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
6751                );
6752                let res = err!(
6753                    self.builder
6754                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6755                );
6756                self.state.push1(res);
6757            }
6758            Operator::I32LtS | Operator::I64LtS => {
6759                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6760                let v1 = self.apply_pending_canonicalization(v1, i1)?;
6761                let v2 = self.apply_pending_canonicalization(v2, i2)?;
6762                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
6763                let cond = err!(
6764                    self.builder
6765                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
6766                );
6767                let res = err!(
6768                    self.builder
6769                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
6770                );
6771                self.state.push1_extra(
6772                    res,
6773                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
6774                );
6775            }
6776            Operator::I8x16LtS => {
6777                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6778                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
6779                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
6780                let res = err!(
6781                    self.builder
6782                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
6783                );
6784                let res = err!(
6785                    self.builder
6786                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
6787                );
6788                let res = err!(
6789                    self.builder
6790                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6791                );
6792                self.state.push1(res);
6793            }
6794            Operator::I16x8LtS => {
6795                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6796                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
6797                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
6798                let res = err!(
6799                    self.builder
6800                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
6801                );
6802                let res = err!(
6803                    self.builder
6804                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
6805                );
6806                let res = err!(
6807                    self.builder
6808                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6809                );
6810                self.state.push1(res);
6811            }
6812            Operator::I32x4LtS => {
6813                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6814                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
6815                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
6816                let res = err!(
6817                    self.builder
6818                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
6819                );
6820                let res = err!(
6821                    self.builder
6822                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
6823                );
6824                let res = err!(
6825                    self.builder
6826                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6827                );
6828                self.state.push1(res);
6829            }
6830            Operator::I64x2LtS => {
6831                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6832                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
6833                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
6834                let res = err!(
6835                    self.builder
6836                        .build_int_compare(IntPredicate::SLT, v1, v2, "")
6837                );
6838                let res = err!(
6839                    self.builder
6840                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
6841                );
6842                let res = err!(
6843                    self.builder
6844                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6845                );
6846                self.state.push1(res);
6847            }
6848            Operator::I32LtU | Operator::I64LtU => {
6849                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6850                let v1 = self.apply_pending_canonicalization(v1, i1)?;
6851                let v2 = self.apply_pending_canonicalization(v2, i2)?;
6852                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
6853                let cond = err!(
6854                    self.builder
6855                        .build_int_compare(IntPredicate::ULT, v1, v2, "")
6856                );
6857                let res = err!(
6858                    self.builder
6859                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
6860                );
6861                self.state.push1(res);
6862            }
6863            Operator::I8x16LtU => {
6864                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6865                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
6866                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
6867                let res = err!(
6868                    self.builder
6869                        .build_int_compare(IntPredicate::ULT, v1, v2, "")
6870                );
6871                let res = err!(
6872                    self.builder
6873                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
6874                );
6875                let res = err!(
6876                    self.builder
6877                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6878                );
6879                self.state.push1(res);
6880            }
6881            Operator::I16x8LtU => {
6882                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6883                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
6884                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
6885                let res = err!(
6886                    self.builder
6887                        .build_int_compare(IntPredicate::ULT, v1, v2, "")
6888                );
6889                let res = err!(
6890                    self.builder
6891                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
6892                );
6893                let res = err!(
6894                    self.builder
6895                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6896                );
6897                self.state.push1(res);
6898            }
6899            Operator::I32x4LtU => {
6900                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6901                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
6902                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
6903                let res = err!(
6904                    self.builder
6905                        .build_int_compare(IntPredicate::ULT, v1, v2, "")
6906                );
6907                let res = err!(
6908                    self.builder
6909                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
6910                );
6911                let res = err!(
6912                    self.builder
6913                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6914                );
6915                self.state.push1(res);
6916            }
6917            Operator::I32LeS | Operator::I64LeS => {
6918                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6919                let v1 = self.apply_pending_canonicalization(v1, i1)?;
6920                let v2 = self.apply_pending_canonicalization(v2, i2)?;
6921                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
6922                let cond = err!(
6923                    self.builder
6924                        .build_int_compare(IntPredicate::SLE, v1, v2, "")
6925                );
6926                let res = err!(
6927                    self.builder
6928                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
6929                );
6930                self.state.push1_extra(
6931                    res,
6932                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
6933                );
6934            }
6935            Operator::I8x16LeS => {
6936                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6937                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
6938                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
6939                let res = err!(
6940                    self.builder
6941                        .build_int_compare(IntPredicate::SLE, v1, v2, "")
6942                );
6943                let res = err!(
6944                    self.builder
6945                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
6946                );
6947                let res = err!(
6948                    self.builder
6949                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6950                );
6951                self.state.push1(res);
6952            }
6953            Operator::I16x8LeS => {
6954                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6955                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
6956                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
6957                let res = err!(
6958                    self.builder
6959                        .build_int_compare(IntPredicate::SLE, v1, v2, "")
6960                );
6961                let res = err!(
6962                    self.builder
6963                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
6964                );
6965                let res = err!(
6966                    self.builder
6967                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6968                );
6969                self.state.push1(res);
6970            }
6971            Operator::I32x4LeS => {
6972                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6973                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
6974                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
6975                let res = err!(
6976                    self.builder
6977                        .build_int_compare(IntPredicate::SLE, v1, v2, "")
6978                );
6979                let res = err!(
6980                    self.builder
6981                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
6982                );
6983                let res = err!(
6984                    self.builder
6985                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
6986                );
6987                self.state.push1(res);
6988            }
6989            Operator::I64x2LeS => {
6990                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
6991                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
6992                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
6993                let res = err!(
6994                    self.builder
6995                        .build_int_compare(IntPredicate::SLE, v1, v2, "")
6996                );
6997                let res = err!(
6998                    self.builder
6999                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7000                );
7001                let res = err!(
7002                    self.builder
7003                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7004                );
7005                self.state.push1(res);
7006            }
7007            Operator::I32LeU | Operator::I64LeU => {
7008                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7009                let v1 = self.apply_pending_canonicalization(v1, i1)?;
7010                let v2 = self.apply_pending_canonicalization(v2, i2)?;
7011                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
7012                let cond = err!(
7013                    self.builder
7014                        .build_int_compare(IntPredicate::ULE, v1, v2, "")
7015                );
7016                let res = err!(
7017                    self.builder
7018                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7019                );
7020                self.state.push1_extra(
7021                    res,
7022                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7023                );
7024            }
7025            Operator::I8x16LeU => {
7026                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7027                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
7028                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
7029                let res = err!(
7030                    self.builder
7031                        .build_int_compare(IntPredicate::ULE, v1, v2, "")
7032                );
7033                let res = err!(
7034                    self.builder
7035                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
7036                );
7037                let res = err!(
7038                    self.builder
7039                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7040                );
7041                self.state.push1(res);
7042            }
7043            Operator::I16x8LeU => {
7044                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7045                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
7046                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
7047                let res = err!(
7048                    self.builder
7049                        .build_int_compare(IntPredicate::ULE, v1, v2, "")
7050                );
7051                let res = err!(
7052                    self.builder
7053                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
7054                );
7055                let res = err!(
7056                    self.builder
7057                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7058                );
7059                self.state.push1(res);
7060            }
7061            Operator::I32x4LeU => {
7062                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7063                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
7064                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
7065                let res = err!(
7066                    self.builder
7067                        .build_int_compare(IntPredicate::ULE, v1, v2, "")
7068                );
7069                let res = err!(
7070                    self.builder
7071                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7072                );
7073                let res = err!(
7074                    self.builder
7075                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7076                );
7077                self.state.push1(res);
7078            }
7079            Operator::I32GtS | Operator::I64GtS => {
7080                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7081                let v1 = self.apply_pending_canonicalization(v1, i1)?;
7082                let v2 = self.apply_pending_canonicalization(v2, i2)?;
7083                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
7084                let cond = err!(
7085                    self.builder
7086                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
7087                );
7088                let res = err!(
7089                    self.builder
7090                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7091                );
7092                self.state.push1_extra(
7093                    res,
7094                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7095                );
7096            }
7097            Operator::I8x16GtS => {
7098                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7099                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
7100                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
7101                let res = err!(
7102                    self.builder
7103                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
7104                );
7105                let res = err!(
7106                    self.builder
7107                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
7108                );
7109                let res = err!(
7110                    self.builder
7111                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7112                );
7113                self.state.push1(res);
7114            }
7115            Operator::I16x8GtS => {
7116                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7117                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
7118                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
7119                let res = err!(
7120                    self.builder
7121                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
7122                );
7123                let res = err!(
7124                    self.builder
7125                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
7126                );
7127                let res = err!(
7128                    self.builder
7129                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7130                );
7131                self.state.push1(res);
7132            }
7133            Operator::I32x4GtS => {
7134                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7135                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
7136                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
7137                let res = err!(
7138                    self.builder
7139                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
7140                );
7141                let res = err!(
7142                    self.builder
7143                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7144                );
7145                let res = err!(
7146                    self.builder
7147                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7148                );
7149                self.state.push1(res);
7150            }
7151            Operator::I64x2GtS => {
7152                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7153                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
7154                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
7155                let res = err!(
7156                    self.builder
7157                        .build_int_compare(IntPredicate::SGT, v1, v2, "")
7158                );
7159                let res = err!(
7160                    self.builder
7161                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7162                );
7163                let res = err!(
7164                    self.builder
7165                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7166                );
7167                self.state.push1(res);
7168            }
7169            Operator::I32GtU | Operator::I64GtU => {
7170                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7171                let v1 = self.apply_pending_canonicalization(v1, i1)?;
7172                let v2 = self.apply_pending_canonicalization(v2, i2)?;
7173                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
7174                let cond = err!(
7175                    self.builder
7176                        .build_int_compare(IntPredicate::UGT, v1, v2, "")
7177                );
7178                let res = err!(
7179                    self.builder
7180                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7181                );
7182                self.state.push1_extra(
7183                    res,
7184                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7185                );
7186            }
7187            Operator::I8x16GtU => {
7188                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7189                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
7190                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
7191                let res = err!(
7192                    self.builder
7193                        .build_int_compare(IntPredicate::UGT, v1, v2, "")
7194                );
7195                let res = err!(
7196                    self.builder
7197                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
7198                );
7199                let res = err!(
7200                    self.builder
7201                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7202                );
7203                self.state.push1(res);
7204            }
7205            Operator::I16x8GtU => {
7206                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7207                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
7208                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
7209                let res = err!(
7210                    self.builder
7211                        .build_int_compare(IntPredicate::UGT, v1, v2, "")
7212                );
7213                let res = err!(
7214                    self.builder
7215                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
7216                );
7217                let res = err!(
7218                    self.builder
7219                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7220                );
7221                self.state.push1(res);
7222            }
7223            Operator::I32x4GtU => {
7224                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7225                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
7226                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
7227                let res = err!(
7228                    self.builder
7229                        .build_int_compare(IntPredicate::UGT, v1, v2, "")
7230                );
7231                let res = err!(
7232                    self.builder
7233                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7234                );
7235                let res = err!(
7236                    self.builder
7237                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7238                );
7239                self.state.push1(res);
7240            }
7241            Operator::I32GeS | Operator::I64GeS => {
7242                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7243                let v1 = self.apply_pending_canonicalization(v1, i1)?;
7244                let v2 = self.apply_pending_canonicalization(v2, i2)?;
7245                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
7246                let cond = err!(
7247                    self.builder
7248                        .build_int_compare(IntPredicate::SGE, v1, v2, "")
7249                );
7250                let res = err!(
7251                    self.builder
7252                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7253                );
7254                self.state.push1(res);
7255            }
7256            Operator::I8x16GeS => {
7257                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7258                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
7259                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
7260                let res = err!(
7261                    self.builder
7262                        .build_int_compare(IntPredicate::SGE, v1, v2, "")
7263                );
7264                let res = err!(
7265                    self.builder
7266                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
7267                );
7268                let res = err!(
7269                    self.builder
7270                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7271                );
7272                self.state.push1(res);
7273            }
7274            Operator::I16x8GeS => {
7275                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7276                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
7277                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
7278                let res = err!(
7279                    self.builder
7280                        .build_int_compare(IntPredicate::SGE, v1, v2, "")
7281                );
7282                let res = err!(
7283                    self.builder
7284                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
7285                );
7286                let res = err!(
7287                    self.builder
7288                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7289                );
7290                self.state.push1(res);
7291            }
7292            Operator::I32x4GeS => {
7293                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7294                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
7295                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
7296                let res = err!(
7297                    self.builder
7298                        .build_int_compare(IntPredicate::SGE, v1, v2, "")
7299                );
7300                let res = err!(
7301                    self.builder
7302                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7303                );
7304                let res = err!(
7305                    self.builder
7306                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7307                );
7308                self.state.push1(res);
7309            }
7310            Operator::I64x2GeS => {
7311                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7312                let (v1, _) = self.v128_into_i64x2(v1, i1)?;
7313                let (v2, _) = self.v128_into_i64x2(v2, i2)?;
7314                let res = err!(
7315                    self.builder
7316                        .build_int_compare(IntPredicate::SGE, v1, v2, "")
7317                );
7318                let res = err!(
7319                    self.builder
7320                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7321                );
7322                let res = err!(
7323                    self.builder
7324                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7325                );
7326                self.state.push1(res);
7327            }
7328            Operator::I32GeU | Operator::I64GeU => {
7329                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7330                let v1 = self.apply_pending_canonicalization(v1, i1)?;
7331                let v2 = self.apply_pending_canonicalization(v2, i2)?;
7332                let (v1, v2) = (v1.into_int_value(), v2.into_int_value());
7333                let cond = err!(
7334                    self.builder
7335                        .build_int_compare(IntPredicate::UGE, v1, v2, "")
7336                );
7337                let res = err!(
7338                    self.builder
7339                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7340                );
7341                self.state.push1_extra(
7342                    res,
7343                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7344                );
7345            }
7346            Operator::I8x16GeU => {
7347                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7348                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
7349                let (v2, _) = self.v128_into_i8x16(v2, i2)?;
7350                let res = err!(
7351                    self.builder
7352                        .build_int_compare(IntPredicate::UGE, v1, v2, "")
7353                );
7354                let res = err!(
7355                    self.builder
7356                        .build_int_s_extend(res, self.intrinsics.i8x16_ty, "")
7357                );
7358                let res = err!(
7359                    self.builder
7360                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7361                );
7362                self.state.push1(res);
7363            }
7364            Operator::I16x8GeU => {
7365                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7366                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
7367                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
7368                let res = err!(
7369                    self.builder
7370                        .build_int_compare(IntPredicate::UGE, v1, v2, "")
7371                );
7372                let res = err!(
7373                    self.builder
7374                        .build_int_s_extend(res, self.intrinsics.i16x8_ty, "")
7375                );
7376                let res = err!(
7377                    self.builder
7378                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7379                );
7380                self.state.push1(res);
7381            }
7382            Operator::I32x4GeU => {
7383                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7384                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
7385                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
7386                let res = err!(
7387                    self.builder
7388                        .build_int_compare(IntPredicate::UGE, v1, v2, "")
7389                );
7390                let res = err!(
7391                    self.builder
7392                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7393                );
7394                let res = err!(
7395                    self.builder
7396                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7397                );
7398                self.state.push1(res);
7399            }
7400
7401            Operator::F32Eq | Operator::F64Eq => {
7406                let (v1, v2) = self.state.pop2()?;
7407                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
7408                let cond = err!(
7409                    self.builder
7410                        .build_float_compare(FloatPredicate::OEQ, v1, v2, "")
7411                );
7412                let res = err!(
7413                    self.builder
7414                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7415                );
7416                self.state.push1_extra(
7417                    res,
7418                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7419                );
7420            }
7421            Operator::F32x4Eq => {
7422                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7423                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
7424                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
7425                let res = err!(
7426                    self.builder
7427                        .build_float_compare(FloatPredicate::OEQ, v1, v2, "")
7428                );
7429                let res = err!(
7430                    self.builder
7431                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7432                );
7433                let res = err!(
7434                    self.builder
7435                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7436                );
7437                self.state.push1(res);
7438            }
7439            Operator::F64x2Eq => {
7440                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7441                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
7442                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
7443                let res = err!(
7444                    self.builder
7445                        .build_float_compare(FloatPredicate::OEQ, v1, v2, "")
7446                );
7447                let res = err!(
7448                    self.builder
7449                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7450                );
7451                let res = err!(
7452                    self.builder
7453                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7454                );
7455                self.state.push1(res);
7456            }
7457            Operator::F32Ne | Operator::F64Ne => {
7458                let (v1, v2) = self.state.pop2()?;
7459                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
7460                let cond = err!(
7461                    self.builder
7462                        .build_float_compare(FloatPredicate::UNE, v1, v2, "")
7463                );
7464                let res = err!(
7465                    self.builder
7466                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7467                );
7468                self.state.push1_extra(
7469                    res,
7470                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7471                );
7472            }
7473            Operator::F32x4Ne => {
7474                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7475                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
7476                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
7477                let res = err!(
7478                    self.builder
7479                        .build_float_compare(FloatPredicate::UNE, v1, v2, "")
7480                );
7481                let res = err!(
7482                    self.builder
7483                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7484                );
7485                let res = err!(
7486                    self.builder
7487                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7488                );
7489                self.state.push1(res);
7490            }
7491            Operator::F64x2Ne => {
7492                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7493                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
7494                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
7495                let res = err!(
7496                    self.builder
7497                        .build_float_compare(FloatPredicate::UNE, v1, v2, "")
7498                );
7499                let res = err!(
7500                    self.builder
7501                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7502                );
7503                let res = err!(
7504                    self.builder
7505                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7506                );
7507                self.state.push1(res);
7508            }
7509            Operator::F32Lt | Operator::F64Lt => {
7510                let (v1, v2) = self.state.pop2()?;
7511                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
7512                let cond = err!(
7513                    self.builder
7514                        .build_float_compare(FloatPredicate::OLT, v1, v2, "")
7515                );
7516                let res = err!(
7517                    self.builder
7518                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7519                );
7520                self.state.push1_extra(
7521                    res,
7522                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7523                );
7524            }
7525            Operator::F32x4Lt => {
7526                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7527                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
7528                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
7529                let res = err!(
7530                    self.builder
7531                        .build_float_compare(FloatPredicate::OLT, v1, v2, "")
7532                );
7533                let res = err!(
7534                    self.builder
7535                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7536                );
7537                let res = err!(
7538                    self.builder
7539                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7540                );
7541                self.state.push1(res);
7542            }
7543            Operator::F64x2Lt => {
7544                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7545                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
7546                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
7547                let res = err!(
7548                    self.builder
7549                        .build_float_compare(FloatPredicate::OLT, v1, v2, "")
7550                );
7551                let res = err!(
7552                    self.builder
7553                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7554                );
7555                let res = err!(
7556                    self.builder
7557                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7558                );
7559                self.state.push1(res);
7560            }
7561            Operator::F32Le | Operator::F64Le => {
7562                let (v1, v2) = self.state.pop2()?;
7563                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
7564                let cond = err!(
7565                    self.builder
7566                        .build_float_compare(FloatPredicate::OLE, v1, v2, "")
7567                );
7568                let res = err!(
7569                    self.builder
7570                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7571                );
7572                self.state.push1_extra(
7573                    res,
7574                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7575                );
7576            }
7577            Operator::F32x4Le => {
7578                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7579                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
7580                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
7581                let res = err!(
7582                    self.builder
7583                        .build_float_compare(FloatPredicate::OLE, v1, v2, "")
7584                );
7585                let res = err!(
7586                    self.builder
7587                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7588                );
7589                let res = err!(
7590                    self.builder
7591                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7592                );
7593                self.state.push1(res);
7594            }
7595            Operator::F64x2Le => {
7596                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7597                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
7598                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
7599                let res = err!(
7600                    self.builder
7601                        .build_float_compare(FloatPredicate::OLE, v1, v2, "")
7602                );
7603                let res = err!(
7604                    self.builder
7605                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7606                );
7607                let res = err!(
7608                    self.builder
7609                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7610                );
7611                self.state.push1(res);
7612            }
7613            Operator::F32Gt | Operator::F64Gt => {
7614                let (v1, v2) = self.state.pop2()?;
7615                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
7616                let cond = err!(
7617                    self.builder
7618                        .build_float_compare(FloatPredicate::OGT, v1, v2, "")
7619                );
7620                let res = err!(
7621                    self.builder
7622                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7623                );
7624                self.state.push1_extra(
7625                    res,
7626                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7627                );
7628            }
7629            Operator::F32x4Gt => {
7630                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7631                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
7632                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
7633                let res = err!(
7634                    self.builder
7635                        .build_float_compare(FloatPredicate::OGT, v1, v2, "")
7636                );
7637                let res = err!(
7638                    self.builder
7639                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7640                );
7641                let res = err!(
7642                    self.builder
7643                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7644                );
7645                self.state.push1(res);
7646            }
7647            Operator::F64x2Gt => {
7648                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7649                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
7650                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
7651                let res = err!(
7652                    self.builder
7653                        .build_float_compare(FloatPredicate::OGT, v1, v2, "")
7654                );
7655                let res = err!(
7656                    self.builder
7657                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7658                );
7659                let res = err!(
7660                    self.builder
7661                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7662                );
7663                self.state.push1(res);
7664            }
7665            Operator::F32Ge | Operator::F64Ge => {
7666                let (v1, v2) = self.state.pop2()?;
7667                let (v1, v2) = (v1.into_float_value(), v2.into_float_value());
7668                let cond = err!(
7669                    self.builder
7670                        .build_float_compare(FloatPredicate::OGE, v1, v2, "")
7671                );
7672                let res = err!(
7673                    self.builder
7674                        .build_int_z_extend(cond, self.intrinsics.i32_ty, "")
7675                );
7676                self.state.push1_extra(
7677                    res,
7678                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
7679                );
7680            }
7681            Operator::F32x4Ge => {
7682                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7683                let (v1, _) = self.v128_into_f32x4(v1, i1)?;
7684                let (v2, _) = self.v128_into_f32x4(v2, i2)?;
7685                let res = err!(
7686                    self.builder
7687                        .build_float_compare(FloatPredicate::OGE, v1, v2, "")
7688                );
7689                let res = err!(
7690                    self.builder
7691                        .build_int_s_extend(res, self.intrinsics.i32x4_ty, "")
7692                );
7693                let res = err!(
7694                    self.builder
7695                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7696                );
7697                self.state.push1(res);
7698            }
7699            Operator::F64x2Ge => {
7700                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7701                let (v1, _) = self.v128_into_f64x2(v1, i1)?;
7702                let (v2, _) = self.v128_into_f64x2(v2, i2)?;
7703                let res = err!(
7704                    self.builder
7705                        .build_float_compare(FloatPredicate::OGE, v1, v2, "")
7706                );
7707                let res = err!(
7708                    self.builder
7709                        .build_int_s_extend(res, self.intrinsics.i64x2_ty, "")
7710                );
7711                let res = err!(
7712                    self.builder
7713                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7714                );
7715                self.state.push1(res);
7716            }
7717
7718            Operator::I32WrapI64 => {
7723                let (v, i) = self.state.pop1_extra()?;
7724                let v = self.apply_pending_canonicalization(v, i)?;
7725                let v = v.into_int_value();
7726                let res = err!(
7727                    self.builder
7728                        .build_int_truncate(v, self.intrinsics.i32_ty, "")
7729                );
7730                self.state.push1(res);
7731            }
7732            Operator::I64ExtendI32S => {
7733                let (v, i) = self.state.pop1_extra()?;
7734                let v = self.apply_pending_canonicalization(v, i)?;
7735                let v = v.into_int_value();
7736                let res = err!(
7737                    self.builder
7738                        .build_int_s_extend(v, self.intrinsics.i64_ty, "")
7739                );
7740                self.state.push1(res);
7741            }
7742            Operator::I64ExtendI32U => {
7743                let (v, i) = self.state.pop1_extra()?;
7744                let v = self.apply_pending_canonicalization(v, i)?;
7745                let v = v.into_int_value();
7746                let res = err!(
7747                    self.builder
7748                        .build_int_z_extend(v, self.intrinsics.i64_ty, "")
7749                );
7750                self.state.push1_extra(res, ExtraInfo::arithmetic_f64());
7751            }
7752            Operator::I16x8ExtendLowI8x16S => {
7753                let (v, i) = self.state.pop1_extra()?;
7754                let (v, _) = self.v128_into_i8x16(v, i)?;
7755                let low = err!(self.builder.build_shuffle_vector(
7756                    v,
7757                    v.get_type().get_undef(),
7758                    VectorType::const_vector(&[
7759                        self.intrinsics.i32_consts[0],
7760                        self.intrinsics.i32_consts[1],
7761                        self.intrinsics.i32_consts[2],
7762                        self.intrinsics.i32_consts[3],
7763                        self.intrinsics.i32_consts[4],
7764                        self.intrinsics.i32_consts[5],
7765                        self.intrinsics.i32_consts[6],
7766                        self.intrinsics.i32_consts[7],
7767                    ]),
7768                    "",
7769                ));
7770                let res = err!(
7771                    self.builder
7772                        .build_int_s_extend(low, self.intrinsics.i16x8_ty, "")
7773                );
7774                let res = err!(
7775                    self.builder
7776                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7777                );
7778                self.state.push1(res);
7779            }
7780            Operator::I16x8ExtendHighI8x16S => {
7781                let (v, i) = self.state.pop1_extra()?;
7782                let (v, _) = self.v128_into_i8x16(v, i)?;
7783                let low = err!(self.builder.build_shuffle_vector(
7784                    v,
7785                    v.get_type().get_undef(),
7786                    VectorType::const_vector(&[
7787                        self.intrinsics.i32_consts[8],
7788                        self.intrinsics.i32_consts[9],
7789                        self.intrinsics.i32_consts[10],
7790                        self.intrinsics.i32_consts[11],
7791                        self.intrinsics.i32_consts[12],
7792                        self.intrinsics.i32_consts[13],
7793                        self.intrinsics.i32_consts[14],
7794                        self.intrinsics.i32_consts[15],
7795                    ]),
7796                    "",
7797                ));
7798                let res = err!(
7799                    self.builder
7800                        .build_int_s_extend(low, self.intrinsics.i16x8_ty, "")
7801                );
7802                let res = err!(
7803                    self.builder
7804                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7805                );
7806                self.state.push1(res);
7807            }
7808            Operator::I16x8ExtendLowI8x16U => {
7809                let (v, i) = self.state.pop1_extra()?;
7810                let (v, _) = self.v128_into_i8x16(v, i)?;
7811                let low = err!(self.builder.build_shuffle_vector(
7812                    v,
7813                    v.get_type().get_undef(),
7814                    VectorType::const_vector(&[
7815                        self.intrinsics.i32_consts[0],
7816                        self.intrinsics.i32_consts[1],
7817                        self.intrinsics.i32_consts[2],
7818                        self.intrinsics.i32_consts[3],
7819                        self.intrinsics.i32_consts[4],
7820                        self.intrinsics.i32_consts[5],
7821                        self.intrinsics.i32_consts[6],
7822                        self.intrinsics.i32_consts[7],
7823                    ]),
7824                    "",
7825                ));
7826                let res = err!(
7827                    self.builder
7828                        .build_int_z_extend(low, self.intrinsics.i16x8_ty, "")
7829                );
7830                let res = err!(
7831                    self.builder
7832                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7833                );
7834                self.state.push1(res);
7835            }
7836            Operator::I16x8ExtendHighI8x16U => {
7837                let (v, i) = self.state.pop1_extra()?;
7838                let (v, _) = self.v128_into_i8x16(v, i)?;
7839                let low = err!(self.builder.build_shuffle_vector(
7840                    v,
7841                    v.get_type().get_undef(),
7842                    VectorType::const_vector(&[
7843                        self.intrinsics.i32_consts[8],
7844                        self.intrinsics.i32_consts[9],
7845                        self.intrinsics.i32_consts[10],
7846                        self.intrinsics.i32_consts[11],
7847                        self.intrinsics.i32_consts[12],
7848                        self.intrinsics.i32_consts[13],
7849                        self.intrinsics.i32_consts[14],
7850                        self.intrinsics.i32_consts[15],
7851                    ]),
7852                    "",
7853                ));
7854                let res = err!(
7855                    self.builder
7856                        .build_int_z_extend(low, self.intrinsics.i16x8_ty, "")
7857                );
7858                let res = err!(
7859                    self.builder
7860                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7861                );
7862                self.state.push1(res);
7863            }
7864            Operator::I32x4ExtendLowI16x8S => {
7865                let (v, i) = self.state.pop1_extra()?;
7866                let (v, _) = self.v128_into_i16x8(v, i)?;
7867                let low = err!(self.builder.build_shuffle_vector(
7868                    v,
7869                    v.get_type().get_undef(),
7870                    VectorType::const_vector(&[
7871                        self.intrinsics.i32_consts[0],
7872                        self.intrinsics.i32_consts[1],
7873                        self.intrinsics.i32_consts[2],
7874                        self.intrinsics.i32_consts[3],
7875                    ]),
7876                    "",
7877                ));
7878                let res = err!(
7879                    self.builder
7880                        .build_int_s_extend(low, self.intrinsics.i32x4_ty, "")
7881                );
7882                let res = err!(
7883                    self.builder
7884                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7885                );
7886                self.state.push1(res);
7887            }
7888            Operator::I32x4ExtendHighI16x8S => {
7889                let (v, i) = self.state.pop1_extra()?;
7890                let (v, _) = self.v128_into_i16x8(v, i)?;
7891                let low = err!(self.builder.build_shuffle_vector(
7892                    v,
7893                    v.get_type().get_undef(),
7894                    VectorType::const_vector(&[
7895                        self.intrinsics.i32_consts[4],
7896                        self.intrinsics.i32_consts[5],
7897                        self.intrinsics.i32_consts[6],
7898                        self.intrinsics.i32_consts[7],
7899                    ]),
7900                    "",
7901                ));
7902                let res = err!(
7903                    self.builder
7904                        .build_int_s_extend(low, self.intrinsics.i32x4_ty, "")
7905                );
7906                let res = err!(
7907                    self.builder
7908                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7909                );
7910                self.state.push1(res);
7911            }
7912            Operator::I32x4ExtendLowI16x8U => {
7913                let (v, i) = self.state.pop1_extra()?;
7914                let (v, _) = self.v128_into_i16x8(v, i)?;
7915                let low = err!(self.builder.build_shuffle_vector(
7916                    v,
7917                    v.get_type().get_undef(),
7918                    VectorType::const_vector(&[
7919                        self.intrinsics.i32_consts[0],
7920                        self.intrinsics.i32_consts[1],
7921                        self.intrinsics.i32_consts[2],
7922                        self.intrinsics.i32_consts[3],
7923                    ]),
7924                    "",
7925                ));
7926                let res = err!(
7927                    self.builder
7928                        .build_int_z_extend(low, self.intrinsics.i32x4_ty, "")
7929                );
7930                let res = err!(
7931                    self.builder
7932                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7933                );
7934                self.state.push1(res);
7935            }
7936            Operator::I32x4ExtendHighI16x8U => {
7937                let (v, i) = self.state.pop1_extra()?;
7938                let (v, _) = self.v128_into_i16x8(v, i)?;
7939                let low = err!(self.builder.build_shuffle_vector(
7940                    v,
7941                    v.get_type().get_undef(),
7942                    VectorType::const_vector(&[
7943                        self.intrinsics.i32_consts[4],
7944                        self.intrinsics.i32_consts[5],
7945                        self.intrinsics.i32_consts[6],
7946                        self.intrinsics.i32_consts[7],
7947                    ]),
7948                    "",
7949                ));
7950                let res = err!(
7951                    self.builder
7952                        .build_int_z_extend(low, self.intrinsics.i32x4_ty, "")
7953                );
7954                let res = err!(
7955                    self.builder
7956                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7957                );
7958                self.state.push1(res);
7959            }
7960            Operator::I64x2ExtendLowI32x4U
7961            | Operator::I64x2ExtendLowI32x4S
7962            | Operator::I64x2ExtendHighI32x4U
7963            | Operator::I64x2ExtendHighI32x4S => {
7964                let extend = match op {
7965                    Operator::I64x2ExtendLowI32x4U | Operator::I64x2ExtendHighI32x4U => {
7966                        |s: &Self, v| s.builder.build_int_z_extend(v, s.intrinsics.i64x2_ty, "")
7967                    }
7968                    Operator::I64x2ExtendLowI32x4S | Operator::I64x2ExtendHighI32x4S => {
7969                        |s: &Self, v| s.builder.build_int_s_extend(v, s.intrinsics.i64x2_ty, "")
7970                    }
7971                    _ => unreachable!("Unhandled inner case"),
7972                };
7973                let indices = match op {
7974                    Operator::I64x2ExtendLowI32x4S | Operator::I64x2ExtendLowI32x4U => {
7975                        [self.intrinsics.i32_consts[0], self.intrinsics.i32_consts[1]]
7976                    }
7977                    Operator::I64x2ExtendHighI32x4S | Operator::I64x2ExtendHighI32x4U => {
7978                        [self.intrinsics.i32_consts[2], self.intrinsics.i32_consts[3]]
7979                    }
7980                    _ => unreachable!("Unhandled inner case"),
7981                };
7982                let (v, i) = self.state.pop1_extra()?;
7983                let (v, _) = self.v128_into_i32x4(v, i)?;
7984                let low = err!(self.builder.build_shuffle_vector(
7985                    v,
7986                    v.get_type().get_undef(),
7987                    VectorType::const_vector(&indices),
7988                    "",
7989                ));
7990                let res = err!(extend(self, low));
7991                let res = err!(
7992                    self.builder
7993                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
7994                );
7995                self.state.push1(res);
7996            }
7997            Operator::I8x16NarrowI16x8S => {
7998                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
7999                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
8000                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
8001                let min = self.intrinsics.i16_ty.const_int(0xff80, false);
8002                let max = self.intrinsics.i16_ty.const_int(0x007f, false);
8003                let min = VectorType::const_vector(&[min; 8]);
8004                let max = VectorType::const_vector(&[max; 8]);
8005                let apply_min_clamp_v1 =
8006                    err!(
8007                        self.builder
8008                            .build_int_compare(IntPredicate::SLT, v1, min, "")
8009                    );
8010                let apply_max_clamp_v1 =
8011                    err!(
8012                        self.builder
8013                            .build_int_compare(IntPredicate::SGT, v1, max, "")
8014                    );
8015                let apply_min_clamp_v2 =
8016                    err!(
8017                        self.builder
8018                            .build_int_compare(IntPredicate::SLT, v2, min, "")
8019                    );
8020                let apply_max_clamp_v2 =
8021                    err!(
8022                        self.builder
8023                            .build_int_compare(IntPredicate::SGT, v2, max, "")
8024                    );
8025                let v1 = err!(self.builder.build_select(apply_min_clamp_v1, min, v1, ""))
8026                    .into_vector_value();
8027                let v1 = err!(self.builder.build_select(apply_max_clamp_v1, max, v1, ""))
8028                    .into_vector_value();
8029                let v1 = err!(self.builder.build_int_truncate(
8030                    v1,
8031                    self.intrinsics.i8_ty.vec_type(8),
8032                    ""
8033                ));
8034                let v2 = err!(self.builder.build_select(apply_min_clamp_v2, min, v2, ""))
8035                    .into_vector_value();
8036                let v2 = err!(self.builder.build_select(apply_max_clamp_v2, max, v2, ""))
8037                    .into_vector_value();
8038                let v2 = err!(self.builder.build_int_truncate(
8039                    v2,
8040                    self.intrinsics.i8_ty.vec_type(8),
8041                    ""
8042                ));
8043                let res = err!(self.builder.build_shuffle_vector(
8044                    v1,
8045                    v2,
8046                    VectorType::const_vector(&[
8047                        self.intrinsics.i32_consts[0],
8048                        self.intrinsics.i32_consts[1],
8049                        self.intrinsics.i32_consts[2],
8050                        self.intrinsics.i32_consts[3],
8051                        self.intrinsics.i32_consts[4],
8052                        self.intrinsics.i32_consts[5],
8053                        self.intrinsics.i32_consts[6],
8054                        self.intrinsics.i32_consts[7],
8055                        self.intrinsics.i32_consts[8],
8056                        self.intrinsics.i32_consts[9],
8057                        self.intrinsics.i32_consts[10],
8058                        self.intrinsics.i32_consts[11],
8059                        self.intrinsics.i32_consts[12],
8060                        self.intrinsics.i32_consts[13],
8061                        self.intrinsics.i32_consts[14],
8062                        self.intrinsics.i32_consts[15],
8063                    ]),
8064                    "",
8065                ));
8066                let res = err!(
8067                    self.builder
8068                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8069                );
8070                self.state.push1(res);
8071            }
8072            Operator::I8x16NarrowI16x8U => {
8073                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
8074                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
8075                let (v2, _) = self.v128_into_i16x8(v2, i2)?;
8076                let min = self.intrinsics.i16x8_ty.const_zero();
8077                let max = self.intrinsics.i16_ty.const_int(0x00ff, false);
8078                let max = VectorType::const_vector(&[max; 8]);
8079                let apply_min_clamp_v1 =
8080                    err!(
8081                        self.builder
8082                            .build_int_compare(IntPredicate::SLT, v1, min, "")
8083                    );
8084                let apply_max_clamp_v1 =
8085                    err!(
8086                        self.builder
8087                            .build_int_compare(IntPredicate::SGT, v1, max, "")
8088                    );
8089                let apply_min_clamp_v2 =
8090                    err!(
8091                        self.builder
8092                            .build_int_compare(IntPredicate::SLT, v2, min, "")
8093                    );
8094                let apply_max_clamp_v2 =
8095                    err!(
8096                        self.builder
8097                            .build_int_compare(IntPredicate::SGT, v2, max, "")
8098                    );
8099                let v1 = err!(self.builder.build_select(apply_min_clamp_v1, min, v1, ""))
8100                    .into_vector_value();
8101                let v1 = err!(self.builder.build_select(apply_max_clamp_v1, max, v1, ""))
8102                    .into_vector_value();
8103                let v1 = err!(self.builder.build_int_truncate(
8104                    v1,
8105                    self.intrinsics.i8_ty.vec_type(8),
8106                    ""
8107                ));
8108                let v2 = err!(self.builder.build_select(apply_min_clamp_v2, min, v2, ""))
8109                    .into_vector_value();
8110                let v2 = err!(self.builder.build_select(apply_max_clamp_v2, max, v2, ""))
8111                    .into_vector_value();
8112                let v2 = err!(self.builder.build_int_truncate(
8113                    v2,
8114                    self.intrinsics.i8_ty.vec_type(8),
8115                    ""
8116                ));
8117                let res = err!(self.builder.build_shuffle_vector(
8118                    v1,
8119                    v2,
8120                    VectorType::const_vector(&[
8121                        self.intrinsics.i32_consts[0],
8122                        self.intrinsics.i32_consts[1],
8123                        self.intrinsics.i32_consts[2],
8124                        self.intrinsics.i32_consts[3],
8125                        self.intrinsics.i32_consts[4],
8126                        self.intrinsics.i32_consts[5],
8127                        self.intrinsics.i32_consts[6],
8128                        self.intrinsics.i32_consts[7],
8129                        self.intrinsics.i32_consts[8],
8130                        self.intrinsics.i32_consts[9],
8131                        self.intrinsics.i32_consts[10],
8132                        self.intrinsics.i32_consts[11],
8133                        self.intrinsics.i32_consts[12],
8134                        self.intrinsics.i32_consts[13],
8135                        self.intrinsics.i32_consts[14],
8136                        self.intrinsics.i32_consts[15],
8137                    ]),
8138                    "",
8139                ));
8140                let res = err!(
8141                    self.builder
8142                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8143                );
8144                self.state.push1(res);
8145            }
8146            Operator::I16x8NarrowI32x4S => {
8147                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
8148                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
8149                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
8150                let min = self.intrinsics.i32_ty.const_int(0xffff8000, false);
8151                let max = self.intrinsics.i32_ty.const_int(0x00007fff, false);
8152                let min = VectorType::const_vector(&[min; 4]);
8153                let max = VectorType::const_vector(&[max; 4]);
8154                let apply_min_clamp_v1 =
8155                    err!(
8156                        self.builder
8157                            .build_int_compare(IntPredicate::SLT, v1, min, "")
8158                    );
8159                let apply_max_clamp_v1 =
8160                    err!(
8161                        self.builder
8162                            .build_int_compare(IntPredicate::SGT, v1, max, "")
8163                    );
8164                let apply_min_clamp_v2 =
8165                    err!(
8166                        self.builder
8167                            .build_int_compare(IntPredicate::SLT, v2, min, "")
8168                    );
8169                let apply_max_clamp_v2 =
8170                    err!(
8171                        self.builder
8172                            .build_int_compare(IntPredicate::SGT, v2, max, "")
8173                    );
8174                let v1 = err!(self.builder.build_select(apply_min_clamp_v1, min, v1, ""))
8175                    .into_vector_value();
8176                let v1 = err!(self.builder.build_select(apply_max_clamp_v1, max, v1, ""))
8177                    .into_vector_value();
8178                let v1 = err!(self.builder.build_int_truncate(
8179                    v1,
8180                    self.intrinsics.i16_ty.vec_type(4),
8181                    ""
8182                ));
8183                let v2 = err!(self.builder.build_select(apply_min_clamp_v2, min, v2, ""))
8184                    .into_vector_value();
8185                let v2 = err!(self.builder.build_select(apply_max_clamp_v2, max, v2, ""))
8186                    .into_vector_value();
8187                let v2 = err!(self.builder.build_int_truncate(
8188                    v2,
8189                    self.intrinsics.i16_ty.vec_type(4),
8190                    ""
8191                ));
8192                let res = err!(self.builder.build_shuffle_vector(
8193                    v1,
8194                    v2,
8195                    VectorType::const_vector(&[
8196                        self.intrinsics.i32_consts[0],
8197                        self.intrinsics.i32_consts[1],
8198                        self.intrinsics.i32_consts[2],
8199                        self.intrinsics.i32_consts[3],
8200                        self.intrinsics.i32_consts[4],
8201                        self.intrinsics.i32_consts[5],
8202                        self.intrinsics.i32_consts[6],
8203                        self.intrinsics.i32_consts[7],
8204                    ]),
8205                    "",
8206                ));
8207                let res = err!(
8208                    self.builder
8209                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8210                );
8211                self.state.push1(res);
8212            }
8213            Operator::I16x8NarrowI32x4U => {
8214                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
8215                let (v1, _) = self.v128_into_i32x4(v1, i1)?;
8216                let (v2, _) = self.v128_into_i32x4(v2, i2)?;
8217                let min = self.intrinsics.i32x4_ty.const_zero();
8218                let max = self.intrinsics.i32_ty.const_int(0xffff, false);
8219                let max = VectorType::const_vector(&[max; 4]);
8220                let apply_min_clamp_v1 =
8221                    err!(
8222                        self.builder
8223                            .build_int_compare(IntPredicate::SLT, v1, min, "")
8224                    );
8225                let apply_max_clamp_v1 =
8226                    err!(
8227                        self.builder
8228                            .build_int_compare(IntPredicate::SGT, v1, max, "")
8229                    );
8230                let apply_min_clamp_v2 =
8231                    err!(
8232                        self.builder
8233                            .build_int_compare(IntPredicate::SLT, v2, min, "")
8234                    );
8235                let apply_max_clamp_v2 =
8236                    err!(
8237                        self.builder
8238                            .build_int_compare(IntPredicate::SGT, v2, max, "")
8239                    );
8240                let v1 = err!(self.builder.build_select(apply_min_clamp_v1, min, v1, ""))
8241                    .into_vector_value();
8242                let v1 = err!(self.builder.build_select(apply_max_clamp_v1, max, v1, ""))
8243                    .into_vector_value();
8244                let v1 = err!(self.builder.build_int_truncate(
8245                    v1,
8246                    self.intrinsics.i16_ty.vec_type(4),
8247                    ""
8248                ));
8249                let v2 = err!(self.builder.build_select(apply_min_clamp_v2, min, v2, ""))
8250                    .into_vector_value();
8251                let v2 = err!(self.builder.build_select(apply_max_clamp_v2, max, v2, ""))
8252                    .into_vector_value();
8253                let v2 = err!(self.builder.build_int_truncate(
8254                    v2,
8255                    self.intrinsics.i16_ty.vec_type(4),
8256                    ""
8257                ));
8258                let res = err!(self.builder.build_shuffle_vector(
8259                    v1,
8260                    v2,
8261                    VectorType::const_vector(&[
8262                        self.intrinsics.i32_consts[0],
8263                        self.intrinsics.i32_consts[1],
8264                        self.intrinsics.i32_consts[2],
8265                        self.intrinsics.i32_consts[3],
8266                        self.intrinsics.i32_consts[4],
8267                        self.intrinsics.i32_consts[5],
8268                        self.intrinsics.i32_consts[6],
8269                        self.intrinsics.i32_consts[7],
8270                    ]),
8271                    "",
8272                ));
8273                let res = err!(
8274                    self.builder
8275                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8276                );
8277                self.state.push1(res);
8278            }
8279            Operator::I32x4TruncSatF32x4S => {
8280                let (v, i) = self.state.pop1_extra()?;
8281                let v = self.apply_pending_canonicalization(v, i)?;
8282                let v = v.into_int_value();
8283                let res = self.trunc_sat_into_int(
8284                    self.intrinsics.f32x4_ty,
8285                    self.intrinsics.i32x4_ty,
8286                    LEF32_GEQ_I32_MIN,
8287                    GEF32_LEQ_I32_MAX,
8288                    i32::MIN as u64,
8289                    i32::MAX as u64,
8290                    v,
8291                )?;
8292                self.state.push1(res);
8293            }
8294            Operator::I32x4TruncSatF32x4U => {
8295                let (v, i) = self.state.pop1_extra()?;
8296                let v = self.apply_pending_canonicalization(v, i)?;
8297                let v = v.into_int_value();
8298                let res = self.trunc_sat_into_int(
8299                    self.intrinsics.f32x4_ty,
8300                    self.intrinsics.i32x4_ty,
8301                    LEF32_GEQ_U32_MIN,
8302                    GEF32_LEQ_U32_MAX,
8303                    u32::MIN as u64,
8304                    u32::MAX as u64,
8305                    v,
8306                )?;
8307                self.state.push1(res);
8308            }
8309            Operator::I32x4TruncSatF64x2SZero | Operator::I32x4TruncSatF64x2UZero => {
8310                let ((min, max), (cmp_min, cmp_max)) = match op {
8311                    Operator::I32x4TruncSatF64x2SZero => (
8312                        (i32::MIN as u64, i32::MAX as u64),
8313                        (LEF64_GEQ_I32_MIN, GEF64_LEQ_I32_MAX),
8314                    ),
8315                    Operator::I32x4TruncSatF64x2UZero => (
8316                        (u32::MIN as u64, u32::MAX as u64),
8317                        (LEF64_GEQ_U32_MIN, GEF64_LEQ_U32_MAX),
8318                    ),
8319                    _ => unreachable!("Unhandled internal variant"),
8320                };
8321                let (v, i) = self.state.pop1_extra()?;
8322                let v = self.apply_pending_canonicalization(v, i)?;
8323                let v = v.into_int_value();
8324                let res = self.trunc_sat(
8325                    self.intrinsics.f64x2_ty,
8326                    self.intrinsics.i32_ty.vec_type(2),
8327                    cmp_min,
8328                    cmp_max,
8329                    min,
8330                    max,
8331                    v,
8332                )?;
8333
8334                let zero = self.intrinsics.i32_consts[0];
8335                let zeros = VectorType::const_vector(&[zero; 2]);
8336                let res = err!(self.builder.build_shuffle_vector(
8337                    res,
8338                    zeros,
8339                    VectorType::const_vector(&[
8340                        self.intrinsics.i32_consts[0],
8341                        self.intrinsics.i32_consts[1],
8342                        self.intrinsics.i32_consts[2],
8343                        self.intrinsics.i32_consts[3],
8344                    ]),
8345                    "",
8346                ));
8347                let res = err!(
8348                    self.builder
8349                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8350                );
8351                self.state.push1(res);
8352            }
8353            Operator::I32TruncF32S => {
8384                let v1 = self.state.pop1()?.into_float_value();
8385                self.trap_if_not_representable_as_int(
8386                    0xcf000000, 0x4effffff, v1,
8389                )?;
8390                let res = err!(self.builder.build_float_to_signed_int(
8391                    v1,
8392                    self.intrinsics.i32_ty,
8393                    ""
8394                ));
8395                self.state.push1(res);
8396            }
8397            Operator::I32TruncF64S => {
8398                let v1 = self.state.pop1()?.into_float_value();
8399                self.trap_if_not_representable_as_int(
8400                    0xc1e00000001fffff, 0x41dfffffffffffff, v1,
8403                )?;
8404                let res = err!(self.builder.build_float_to_signed_int(
8405                    v1,
8406                    self.intrinsics.i32_ty,
8407                    ""
8408                ));
8409                self.state.push1(res);
8410            }
8411            Operator::I32TruncSatF32S => {
8412                let (v, i) = self.state.pop1_extra()?;
8413                let v = self.apply_pending_canonicalization(v, i)?;
8414                let v = v.into_float_value();
8415                let res = self.trunc_sat_scalar(
8416                    self.intrinsics.i32_ty,
8417                    LEF32_GEQ_I32_MIN,
8418                    GEF32_LEQ_I32_MAX,
8419                    i32::MIN as u32 as u64,
8420                    i32::MAX as u32 as u64,
8421                    v,
8422                )?;
8423                self.state.push1(res);
8424            }
8425            Operator::I32TruncSatF64S => {
8426                let (v, i) = self.state.pop1_extra()?;
8427                let v = self.apply_pending_canonicalization(v, i)?;
8428                let v = v.into_float_value();
8429                let res = self.trunc_sat_scalar(
8430                    self.intrinsics.i32_ty,
8431                    LEF64_GEQ_I32_MIN,
8432                    GEF64_LEQ_I32_MAX,
8433                    i32::MIN as u64,
8434                    i32::MAX as u64,
8435                    v,
8436                )?;
8437                self.state.push1(res);
8438            }
8439            Operator::I64TruncF32S => {
8440                let v1 = self.state.pop1()?.into_float_value();
8441                self.trap_if_not_representable_as_int(
8442                    0xdf000000, 0x5effffff, v1,
8445                )?;
8446                let res = err!(self.builder.build_float_to_signed_int(
8447                    v1,
8448                    self.intrinsics.i64_ty,
8449                    ""
8450                ));
8451                self.state.push1(res);
8452            }
8453            Operator::I64TruncF64S => {
8454                let v1 = self.state.pop1()?.into_float_value();
8455                self.trap_if_not_representable_as_int(
8456                    0xc3e0000000000000, 0x43dfffffffffffff, v1,
8459                )?;
8460                let res = err!(self.builder.build_float_to_signed_int(
8461                    v1,
8462                    self.intrinsics.i64_ty,
8463                    ""
8464                ));
8465                self.state.push1(res);
8466            }
8467            Operator::I64TruncSatF32S => {
8468                let (v, i) = self.state.pop1_extra()?;
8469                let v = self.apply_pending_canonicalization(v, i)?;
8470                let v = v.into_float_value();
8471                let res = self.trunc_sat_scalar(
8472                    self.intrinsics.i64_ty,
8473                    LEF32_GEQ_I64_MIN,
8474                    GEF32_LEQ_I64_MAX,
8475                    i64::MIN as u64,
8476                    i64::MAX as u64,
8477                    v,
8478                )?;
8479                self.state.push1(res);
8480            }
8481            Operator::I64TruncSatF64S => {
8482                let (v, i) = self.state.pop1_extra()?;
8483                let v = self.apply_pending_canonicalization(v, i)?;
8484                let v = v.into_float_value();
8485                let res = self.trunc_sat_scalar(
8486                    self.intrinsics.i64_ty,
8487                    LEF64_GEQ_I64_MIN,
8488                    GEF64_LEQ_I64_MAX,
8489                    i64::MIN as u64,
8490                    i64::MAX as u64,
8491                    v,
8492                )?;
8493                self.state.push1(res);
8494            }
8495            Operator::I32TruncF32U => {
8496                let v1 = self.state.pop1()?.into_float_value();
8497                self.trap_if_not_representable_as_int(
8498                    0xbf7fffff, 0x4f7fffff, v1,
8501                )?;
8502                let res = err!(self.builder.build_float_to_unsigned_int(
8503                    v1,
8504                    self.intrinsics.i32_ty,
8505                    ""
8506                ));
8507                self.state.push1(res);
8508            }
8509            Operator::I32TruncF64U => {
8510                let v1 = self.state.pop1()?.into_float_value();
8511                self.trap_if_not_representable_as_int(
8512                    0xbfefffffffffffff, 0x41efffffffffffff, v1,
8515                )?;
8516                let res = err!(self.builder.build_float_to_unsigned_int(
8517                    v1,
8518                    self.intrinsics.i32_ty,
8519                    ""
8520                ));
8521                self.state.push1(res);
8522            }
8523            Operator::I32TruncSatF32U => {
8524                let (v, i) = self.state.pop1_extra()?;
8525                let v = self.apply_pending_canonicalization(v, i)?;
8526                let v = v.into_float_value();
8527                let res = self.trunc_sat_scalar(
8528                    self.intrinsics.i32_ty,
8529                    LEF32_GEQ_U32_MIN,
8530                    GEF32_LEQ_U32_MAX,
8531                    u32::MIN as u64,
8532                    u32::MAX as u64,
8533                    v,
8534                )?;
8535                self.state.push1(res);
8536            }
8537            Operator::I32TruncSatF64U => {
8538                let (v, i) = self.state.pop1_extra()?;
8539                let v = self.apply_pending_canonicalization(v, i)?;
8540                let v = v.into_float_value();
8541                let res = self.trunc_sat_scalar(
8542                    self.intrinsics.i32_ty,
8543                    LEF64_GEQ_U32_MIN,
8544                    GEF64_LEQ_U32_MAX,
8545                    u32::MIN as u64,
8546                    u32::MAX as u64,
8547                    v,
8548                )?;
8549                self.state.push1(res);
8550            }
8551            Operator::I64TruncF32U => {
8552                let v1 = self.state.pop1()?.into_float_value();
8553                self.trap_if_not_representable_as_int(
8554                    0xbf7fffff, 0x5f7fffff, v1,
8557                )?;
8558                let res = err!(self.builder.build_float_to_unsigned_int(
8559                    v1,
8560                    self.intrinsics.i64_ty,
8561                    ""
8562                ));
8563                self.state.push1(res);
8564            }
8565            Operator::I64TruncF64U => {
8566                let v1 = self.state.pop1()?.into_float_value();
8567                self.trap_if_not_representable_as_int(
8568                    0xbfefffffffffffff, 0x43efffffffffffff, v1,
8571                )?;
8572                let res = err!(self.builder.build_float_to_unsigned_int(
8573                    v1,
8574                    self.intrinsics.i64_ty,
8575                    ""
8576                ));
8577                self.state.push1(res);
8578            }
8579            Operator::I64TruncSatF32U => {
8580                let (v, i) = self.state.pop1_extra()?;
8581                let v = self.apply_pending_canonicalization(v, i)?;
8582                let v = v.into_float_value();
8583                let res = self.trunc_sat_scalar(
8584                    self.intrinsics.i64_ty,
8585                    LEF32_GEQ_U64_MIN,
8586                    GEF32_LEQ_U64_MAX,
8587                    u64::MIN,
8588                    u64::MAX,
8589                    v,
8590                )?;
8591                self.state.push1(res);
8592            }
8593            Operator::I64TruncSatF64U => {
8594                let (v, i) = self.state.pop1_extra()?;
8595                let v = self.apply_pending_canonicalization(v, i)?;
8596                let v = v.into_float_value();
8597                let res = self.trunc_sat_scalar(
8598                    self.intrinsics.i64_ty,
8599                    LEF64_GEQ_U64_MIN,
8600                    GEF64_LEQ_U64_MAX,
8601                    u64::MIN,
8602                    u64::MAX,
8603                    v,
8604                )?;
8605                self.state.push1(res);
8606            }
8607            Operator::F32DemoteF64 => {
8608                let v = self.state.pop1()?;
8609                let v = v.into_float_value();
8610                let res = err!(self.builder.build_call(
8611                    self.intrinsics.fptrunc_f64,
8612                    &[
8613                        v.into(),
8614                        self.intrinsics.fp_rounding_md,
8615                        self.intrinsics.fp_exception_md,
8616                    ],
8617                    "",
8618                ))
8619                .try_as_basic_value()
8620                .left()
8621                .unwrap();
8622                self.state.push1_extra(res, ExtraInfo::pending_f32_nan());
8623            }
8624            Operator::F64PromoteF32 => {
8625                let v = self.state.pop1()?;
8626                let v = v.into_float_value();
8627                let res = err!(self.builder.build_call(
8628                    self.intrinsics.fpext_f32,
8629                    &[v.into(), self.intrinsics.fp_exception_md],
8630                    "",
8631                ))
8632                .try_as_basic_value()
8633                .left()
8634                .unwrap();
8635                self.state.push1_extra(res, ExtraInfo::pending_f64_nan());
8636            }
8637            Operator::F32ConvertI32S | Operator::F32ConvertI64S => {
8638                let (v, i) = self.state.pop1_extra()?;
8639                let v = self.apply_pending_canonicalization(v, i)?;
8640                let v = v.into_int_value();
8641                let res = err!(self.builder.build_signed_int_to_float(
8642                    v,
8643                    self.intrinsics.f32_ty,
8644                    ""
8645                ));
8646                self.state.push1(res);
8647            }
8648            Operator::F64ConvertI32S | Operator::F64ConvertI64S => {
8649                let (v, i) = self.state.pop1_extra()?;
8650                let v = self.apply_pending_canonicalization(v, i)?;
8651                let v = v.into_int_value();
8652                let res = err!(self.builder.build_signed_int_to_float(
8653                    v,
8654                    self.intrinsics.f64_ty,
8655                    ""
8656                ));
8657                self.state.push1(res);
8658            }
8659            Operator::F32ConvertI32U | Operator::F32ConvertI64U => {
8660                let (v, i) = self.state.pop1_extra()?;
8661                let v = self.apply_pending_canonicalization(v, i)?;
8662                let v = v.into_int_value();
8663                let res = err!(self.builder.build_unsigned_int_to_float(
8664                    v,
8665                    self.intrinsics.f32_ty,
8666                    ""
8667                ));
8668                self.state.push1(res);
8669            }
8670            Operator::F64ConvertI32U | Operator::F64ConvertI64U => {
8671                let (v, i) = self.state.pop1_extra()?;
8672                let v = self.apply_pending_canonicalization(v, i)?;
8673                let v = v.into_int_value();
8674                let res = err!(self.builder.build_unsigned_int_to_float(
8675                    v,
8676                    self.intrinsics.f64_ty,
8677                    ""
8678                ));
8679                self.state.push1(res);
8680            }
8681            Operator::F32x4ConvertI32x4S => {
8682                let v = self.state.pop1()?;
8683                let v = err!(self.builder.build_bit_cast(v, self.intrinsics.i32x4_ty, ""))
8684                    .into_vector_value();
8685                let res = err!(self.builder.build_signed_int_to_float(
8686                    v,
8687                    self.intrinsics.f32x4_ty,
8688                    ""
8689                ));
8690                let res = err!(
8691                    self.builder
8692                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8693                );
8694                self.state.push1(res);
8695            }
8696            Operator::F32x4ConvertI32x4U => {
8697                let v = self.state.pop1()?;
8698                let v = err!(self.builder.build_bit_cast(v, self.intrinsics.i32x4_ty, ""))
8699                    .into_vector_value();
8700                let res = err!(self.builder.build_unsigned_int_to_float(
8701                    v,
8702                    self.intrinsics.f32x4_ty,
8703                    ""
8704                ));
8705                let res = err!(
8706                    self.builder
8707                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8708                );
8709                self.state.push1(res);
8710            }
8711            Operator::F64x2ConvertLowI32x4S | Operator::F64x2ConvertLowI32x4U => {
8712                let extend = match op {
8713                    Operator::F64x2ConvertLowI32x4U => {
8714                        |s: &Self, v| s.builder.build_int_z_extend(v, s.intrinsics.i64x2_ty, "")
8715                    }
8716                    Operator::F64x2ConvertLowI32x4S => {
8717                        |s: &Self, v| s.builder.build_int_s_extend(v, s.intrinsics.i64x2_ty, "")
8718                    }
8719                    _ => unreachable!("Unhandled inner case"),
8720                };
8721                let (v, i) = self.state.pop1_extra()?;
8722                let (v, _) = self.v128_into_i32x4(v, i)?;
8723                let low = err!(self.builder.build_shuffle_vector(
8724                    v,
8725                    v.get_type().get_undef(),
8726                    VectorType::const_vector(&[
8727                        self.intrinsics.i32_consts[0],
8728                        self.intrinsics.i32_consts[1],
8729                    ]),
8730                    "",
8731                ));
8732                let res = err!(extend(self, low));
8733                let res = err!(self.builder.build_signed_int_to_float(
8734                    res,
8735                    self.intrinsics.f64x2_ty,
8736                    ""
8737                ));
8738                let res = err!(
8739                    self.builder
8740                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8741                );
8742                self.state.push1(res);
8743            }
8744            Operator::F64x2PromoteLowF32x4 => {
8745                let (v, i) = self.state.pop1_extra()?;
8746                let (v, _) = self.v128_into_f32x4(v, i)?;
8747                let low = err!(self.builder.build_shuffle_vector(
8748                    v,
8749                    v.get_type().get_undef(),
8750                    VectorType::const_vector(&[
8751                        self.intrinsics.i32_consts[0],
8752                        self.intrinsics.i32_consts[1],
8753                    ]),
8754                    "",
8755                ));
8756                let res = err!(
8757                    self.builder
8758                        .build_float_ext(low, self.intrinsics.f64x2_ty, "")
8759                );
8760                let res = err!(
8761                    self.builder
8762                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8763                );
8764                self.state.push1_extra(res, ExtraInfo::pending_f64_nan());
8765            }
8766            Operator::F32x4DemoteF64x2Zero => {
8767                let (v, i) = self.state.pop1_extra()?;
8768                let (v, _) = self.v128_into_f64x2(v, i)?;
8769                let f32x2_ty = self.intrinsics.f32_ty.vec_type(2);
8770                let res = err!(self.builder.build_float_trunc(v, f32x2_ty, ""));
8771                let zeros = f32x2_ty.const_zero();
8772                let res = err!(self.builder.build_shuffle_vector(
8773                    res,
8774                    zeros,
8775                    VectorType::const_vector(&[
8776                        self.intrinsics.i32_consts[0],
8777                        self.intrinsics.i32_consts[1],
8778                        self.intrinsics.i32_consts[2],
8779                        self.intrinsics.i32_consts[3],
8780                    ]),
8781                    "",
8782                ));
8783                let res = err!(
8784                    self.builder
8785                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
8786                );
8787                self.state.push1_extra(res, ExtraInfo::pending_f32_nan());
8788            }
8789            Operator::I32ReinterpretF32 => {
8814                let (v, i) = self.state.pop1_extra()?;
8815                let v = self.apply_pending_canonicalization(v, i)?;
8816                let ret = err!(self.builder.build_bit_cast(v, self.intrinsics.i32_ty, ""));
8817                self.state.push1_extra(ret, ExtraInfo::arithmetic_f32());
8818            }
8819            Operator::I64ReinterpretF64 => {
8820                let (v, i) = self.state.pop1_extra()?;
8821                let v = self.apply_pending_canonicalization(v, i)?;
8822                let ret = err!(self.builder.build_bit_cast(v, self.intrinsics.i64_ty, ""));
8823                self.state.push1_extra(ret, ExtraInfo::arithmetic_f64());
8824            }
8825            Operator::F32ReinterpretI32 => {
8826                let (v, i) = self.state.pop1_extra()?;
8827                let ret = err!(self.builder.build_bit_cast(v, self.intrinsics.f32_ty, ""));
8828                self.state.push1_extra(ret, i);
8829            }
8830            Operator::F64ReinterpretI64 => {
8831                let (v, i) = self.state.pop1_extra()?;
8832                let ret = err!(self.builder.build_bit_cast(v, self.intrinsics.f64_ty, ""));
8833                self.state.push1_extra(ret, i);
8834            }
8835
8836            Operator::I32Extend8S => {
8841                let value = self.state.pop1()?.into_int_value();
8842                let narrow_value = err!(self.builder.build_int_truncate(
8843                    value,
8844                    self.intrinsics.i8_ty,
8845                    ""
8846                ));
8847                let extended_value = err!(self.builder.build_int_s_extend(
8848                    narrow_value,
8849                    self.intrinsics.i32_ty,
8850                    ""
8851                ));
8852                self.state.push1(extended_value);
8853            }
8854            Operator::I32Extend16S => {
8855                let value = self.state.pop1()?.into_int_value();
8856                let narrow_value = err!(self.builder.build_int_truncate(
8857                    value,
8858                    self.intrinsics.i16_ty,
8859                    ""
8860                ));
8861                let extended_value = err!(self.builder.build_int_s_extend(
8862                    narrow_value,
8863                    self.intrinsics.i32_ty,
8864                    ""
8865                ));
8866                self.state.push1(extended_value);
8867            }
8868            Operator::I64Extend8S => {
8869                let value = self.state.pop1()?.into_int_value();
8870                let narrow_value = err!(self.builder.build_int_truncate(
8871                    value,
8872                    self.intrinsics.i8_ty,
8873                    ""
8874                ));
8875                let extended_value = err!(self.builder.build_int_s_extend(
8876                    narrow_value,
8877                    self.intrinsics.i64_ty,
8878                    ""
8879                ));
8880                self.state.push1(extended_value);
8881            }
8882            Operator::I64Extend16S => {
8883                let value = self.state.pop1()?.into_int_value();
8884                let narrow_value = err!(self.builder.build_int_truncate(
8885                    value,
8886                    self.intrinsics.i16_ty,
8887                    ""
8888                ));
8889                let extended_value = err!(self.builder.build_int_s_extend(
8890                    narrow_value,
8891                    self.intrinsics.i64_ty,
8892                    ""
8893                ));
8894                self.state.push1(extended_value);
8895            }
8896            Operator::I64Extend32S => {
8897                let value = self.state.pop1()?.into_int_value();
8898                let narrow_value = err!(self.builder.build_int_truncate(
8899                    value,
8900                    self.intrinsics.i32_ty,
8901                    ""
8902                ));
8903                let extended_value = err!(self.builder.build_int_s_extend(
8904                    narrow_value,
8905                    self.intrinsics.i64_ty,
8906                    ""
8907                ));
8908                self.state.push1(extended_value);
8909            }
8910
8911            Operator::I32Load { ref memarg } => {
8916                let offset = self.state.pop1()?.into_int_value();
8917                let memory_index = MemoryIndex::from_u32(0);
8918                let effective_address = self.resolve_memory_ptr(
8919                    memory_index,
8920                    memarg,
8921                    self.intrinsics.ptr_ty,
8922                    offset,
8923                    4,
8924                )?;
8925                let result = err!(self.builder.build_load(
8926                    self.intrinsics.i32_ty,
8927                    effective_address,
8928                    ""
8929                ));
8930                self.annotate_user_memaccess(
8931                    memory_index,
8932                    memarg,
8933                    1,
8934                    result.as_instruction_value().unwrap(),
8935                )?;
8936                self.state.push1(result);
8937            }
8938            Operator::I64Load { ref memarg } => {
8939                let offset = self.state.pop1()?.into_int_value();
8940                let memory_index = MemoryIndex::from_u32(0);
8941                let effective_address = self.resolve_memory_ptr(
8942                    memory_index,
8943                    memarg,
8944                    self.intrinsics.ptr_ty,
8945                    offset,
8946                    8,
8947                )?;
8948                let result = err!(self.builder.build_load(
8949                    self.intrinsics.i64_ty,
8950                    effective_address,
8951                    ""
8952                ));
8953                self.annotate_user_memaccess(
8954                    memory_index,
8955                    memarg,
8956                    1,
8957                    result.as_instruction_value().unwrap(),
8958                )?;
8959                self.state.push1(result);
8960            }
8961            Operator::F32Load { ref memarg } => {
8962                let offset = self.state.pop1()?.into_int_value();
8963                let memory_index = MemoryIndex::from_u32(0);
8964                let effective_address = self.resolve_memory_ptr(
8965                    memory_index,
8966                    memarg,
8967                    self.intrinsics.ptr_ty,
8968                    offset,
8969                    4,
8970                )?;
8971                let result = err!(self.builder.build_load(
8972                    self.intrinsics.f32_ty,
8973                    effective_address,
8974                    ""
8975                ));
8976                self.annotate_user_memaccess(
8977                    memory_index,
8978                    memarg,
8979                    1,
8980                    result.as_instruction_value().unwrap(),
8981                )?;
8982                self.state.push1(result);
8983            }
8984            Operator::F64Load { ref memarg } => {
8985                let offset = self.state.pop1()?.into_int_value();
8986                let memory_index = MemoryIndex::from_u32(0);
8987                let effective_address = self.resolve_memory_ptr(
8988                    memory_index,
8989                    memarg,
8990                    self.intrinsics.ptr_ty,
8991                    offset,
8992                    8,
8993                )?;
8994                let result = err!(self.builder.build_load(
8995                    self.intrinsics.f64_ty,
8996                    effective_address,
8997                    ""
8998                ));
8999                self.annotate_user_memaccess(
9000                    memory_index,
9001                    memarg,
9002                    1,
9003                    result.as_instruction_value().unwrap(),
9004                )?;
9005                self.state.push1(result);
9006            }
9007            Operator::V128Load { ref memarg } => {
9008                let offset = self.state.pop1()?.into_int_value();
9009                let memory_index = MemoryIndex::from_u32(0);
9010                let effective_address = self.resolve_memory_ptr(
9011                    memory_index,
9012                    memarg,
9013                    self.intrinsics.ptr_ty,
9014                    offset,
9015                    16,
9016                )?;
9017                let result = err!(self.builder.build_load(
9018                    self.intrinsics.i128_ty,
9019                    effective_address,
9020                    ""
9021                ));
9022                self.annotate_user_memaccess(
9023                    memory_index,
9024                    memarg,
9025                    1,
9026                    result.as_instruction_value().unwrap(),
9027                )?;
9028                self.state.push1(result);
9029            }
9030            Operator::V128Load8Lane { ref memarg, lane } => {
9031                let (v, i) = self.state.pop1_extra()?;
9032                let (v, _i) = self.v128_into_i8x16(v, i)?;
9033                let offset = self.state.pop1()?.into_int_value();
9034                let memory_index = MemoryIndex::from_u32(memarg.memory);
9035                let effective_address = self.resolve_memory_ptr(
9036                    memory_index,
9037                    memarg,
9038                    self.intrinsics.ptr_ty,
9039                    offset,
9040                    1,
9041                )?;
9042                let element = err!(self.builder.build_load(
9043                    self.intrinsics.i8_ty,
9044                    effective_address,
9045                    ""
9046                ));
9047                self.annotate_user_memaccess(
9048                    memory_index,
9049                    memarg,
9050                    1,
9051                    element.as_instruction_value().unwrap(),
9052                )?;
9053                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9054                let res = err!(self.builder.build_insert_element(v, element, idx, ""));
9055                let res = err!(
9056                    self.builder
9057                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9058                );
9059                self.state.push1(res);
9060            }
9061            Operator::V128Load16Lane { ref memarg, lane } => {
9062                let (v, i) = self.state.pop1_extra()?;
9063                let (v, i) = self.v128_into_i16x8(v, i)?;
9064                let offset = self.state.pop1()?.into_int_value();
9065                let memory_index = MemoryIndex::from_u32(memarg.memory);
9066                let effective_address = self.resolve_memory_ptr(
9067                    memory_index,
9068                    memarg,
9069                    self.intrinsics.ptr_ty,
9070                    offset,
9071                    2,
9072                )?;
9073                let element = err!(self.builder.build_load(
9074                    self.intrinsics.i16_ty,
9075                    effective_address,
9076                    ""
9077                ));
9078                self.annotate_user_memaccess(
9079                    memory_index,
9080                    memarg,
9081                    1,
9082                    element.as_instruction_value().unwrap(),
9083                )?;
9084                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9085                let res = err!(self.builder.build_insert_element(v, element, idx, ""));
9086                let res = err!(
9087                    self.builder
9088                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9089                );
9090                self.state.push1_extra(res, i);
9091            }
9092            Operator::V128Load32Lane { ref memarg, lane } => {
9093                let (v, i) = self.state.pop1_extra()?;
9094                let (v, i) = self.v128_into_i32x4(v, i)?;
9095                let offset = self.state.pop1()?.into_int_value();
9096                let memory_index = MemoryIndex::from_u32(memarg.memory);
9097                let effective_address = self.resolve_memory_ptr(
9098                    memory_index,
9099                    memarg,
9100                    self.intrinsics.ptr_ty,
9101                    offset,
9102                    4,
9103                )?;
9104                let element = err!(self.builder.build_load(
9105                    self.intrinsics.i32_ty,
9106                    effective_address,
9107                    ""
9108                ));
9109                self.annotate_user_memaccess(
9110                    memory_index,
9111                    memarg,
9112                    1,
9113                    element.as_instruction_value().unwrap(),
9114                )?;
9115                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9116                let res = err!(self.builder.build_insert_element(v, element, idx, ""));
9117                let res = err!(
9118                    self.builder
9119                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9120                );
9121                self.state.push1_extra(res, i);
9122            }
9123            Operator::V128Load64Lane { ref memarg, lane } => {
9124                let (v, i) = self.state.pop1_extra()?;
9125                let (v, i) = self.v128_into_i64x2(v, i)?;
9126                let offset = self.state.pop1()?.into_int_value();
9127                let memory_index = MemoryIndex::from_u32(memarg.memory);
9128                let effective_address = self.resolve_memory_ptr(
9129                    memory_index,
9130                    memarg,
9131                    self.intrinsics.ptr_ty,
9132                    offset,
9133                    8,
9134                )?;
9135                let element = err!(self.builder.build_load(
9136                    self.intrinsics.i64_ty,
9137                    effective_address,
9138                    ""
9139                ));
9140                self.annotate_user_memaccess(
9141                    memory_index,
9142                    memarg,
9143                    1,
9144                    element.as_instruction_value().unwrap(),
9145                )?;
9146                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9147                let res = err!(self.builder.build_insert_element(v, element, idx, ""));
9148                let res = err!(
9149                    self.builder
9150                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9151                );
9152                self.state.push1_extra(res, i);
9153            }
9154
9155            Operator::I32Store { ref memarg } => {
9156                let value = self.state.pop1()?;
9157                let offset = self.state.pop1()?.into_int_value();
9158                let memory_index = MemoryIndex::from_u32(0);
9159                let effective_address = self.resolve_memory_ptr(
9160                    memory_index,
9161                    memarg,
9162                    self.intrinsics.ptr_ty,
9163                    offset,
9164                    4,
9165                )?;
9166                let dead_load = err!(self.builder.build_load(
9167                    self.intrinsics.i32_ty,
9168                    effective_address,
9169                    ""
9170                ));
9171                self.annotate_user_memaccess(
9172                    memory_index,
9173                    memarg,
9174                    1,
9175                    dead_load.as_instruction_value().unwrap(),
9176                )?;
9177                let store = err!(self.builder.build_store(effective_address, value));
9178                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9179            }
9180            Operator::I64Store { ref memarg } => {
9181                let value = self.state.pop1()?;
9182                let offset = self.state.pop1()?.into_int_value();
9183                let memory_index = MemoryIndex::from_u32(0);
9184                let effective_address = self.resolve_memory_ptr(
9185                    memory_index,
9186                    memarg,
9187                    self.intrinsics.ptr_ty,
9188                    offset,
9189                    8,
9190                )?;
9191                let dead_load = err!(self.builder.build_load(
9192                    self.intrinsics.i64_ty,
9193                    effective_address,
9194                    ""
9195                ));
9196                self.annotate_user_memaccess(
9197                    memory_index,
9198                    memarg,
9199                    1,
9200                    dead_load.as_instruction_value().unwrap(),
9201                )?;
9202                let store = err!(self.builder.build_store(effective_address, value));
9203                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9204            }
9205            Operator::F32Store { ref memarg } => {
9206                let (v, i) = self.state.pop1_extra()?;
9207                let v = self.apply_pending_canonicalization(v, i)?;
9208                let offset = self.state.pop1()?.into_int_value();
9209                let memory_index = MemoryIndex::from_u32(0);
9210                let effective_address = self.resolve_memory_ptr(
9211                    memory_index,
9212                    memarg,
9213                    self.intrinsics.ptr_ty,
9214                    offset,
9215                    4,
9216                )?;
9217                let dead_load = err!(self.builder.build_load(
9218                    self.intrinsics.f32_ty,
9219                    effective_address,
9220                    ""
9221                ));
9222                self.annotate_user_memaccess(
9223                    memory_index,
9224                    memarg,
9225                    1,
9226                    dead_load.as_instruction_value().unwrap(),
9227                )?;
9228                let store = err!(self.builder.build_store(effective_address, v));
9229                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9230            }
9231            Operator::F64Store { ref memarg } => {
9232                let (v, i) = self.state.pop1_extra()?;
9233                let v = self.apply_pending_canonicalization(v, i)?;
9234                let offset = self.state.pop1()?.into_int_value();
9235                let memory_index = MemoryIndex::from_u32(0);
9236                let effective_address = self.resolve_memory_ptr(
9237                    memory_index,
9238                    memarg,
9239                    self.intrinsics.ptr_ty,
9240                    offset,
9241                    8,
9242                )?;
9243                let dead_load = err!(self.builder.build_load(
9244                    self.intrinsics.f64_ty,
9245                    effective_address,
9246                    ""
9247                ));
9248                self.annotate_user_memaccess(
9249                    memory_index,
9250                    memarg,
9251                    1,
9252                    dead_load.as_instruction_value().unwrap(),
9253                )?;
9254                let store = err!(self.builder.build_store(effective_address, v));
9255                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9256            }
9257            Operator::V128Store { ref memarg } => {
9258                let (v, i) = self.state.pop1_extra()?;
9259                let v = self.apply_pending_canonicalization(v, i)?;
9260                let offset = self.state.pop1()?.into_int_value();
9261                let memory_index = MemoryIndex::from_u32(0);
9262                let effective_address = self.resolve_memory_ptr(
9263                    memory_index,
9264                    memarg,
9265                    self.intrinsics.ptr_ty,
9266                    offset,
9267                    16,
9268                )?;
9269                let dead_load = err!(self.builder.build_load(
9270                    self.intrinsics.i128_ty,
9271                    effective_address,
9272                    ""
9273                ));
9274                self.annotate_user_memaccess(
9275                    memory_index,
9276                    memarg,
9277                    1,
9278                    dead_load.as_instruction_value().unwrap(),
9279                )?;
9280                let store = err!(self.builder.build_store(effective_address, v));
9281                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9282            }
9283            Operator::V128Store8Lane { ref memarg, lane } => {
9284                let (v, i) = self.state.pop1_extra()?;
9285                let (v, _i) = self.v128_into_i8x16(v, i)?;
9286                let offset = self.state.pop1()?.into_int_value();
9287                let memory_index = MemoryIndex::from_u32(memarg.memory);
9288
9289                let effective_address = self.resolve_memory_ptr(
9290                    memory_index,
9291                    memarg,
9292                    self.intrinsics.ptr_ty,
9293                    offset,
9294                    1,
9295                )?;
9296                let dead_load = err!(self.builder.build_load(
9297                    self.intrinsics.i8_ty,
9298                    effective_address,
9299                    ""
9300                ));
9301                self.annotate_user_memaccess(
9302                    memory_index,
9303                    memarg,
9304                    1,
9305                    dead_load.as_instruction_value().unwrap(),
9306                )?;
9307                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9308                let val = err!(self.builder.build_extract_element(v, idx, ""));
9309                let store = err!(self.builder.build_store(effective_address, val));
9310                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9311            }
9312            Operator::V128Store16Lane { ref memarg, lane } => {
9313                let (v, i) = self.state.pop1_extra()?;
9314                let (v, _i) = self.v128_into_i16x8(v, i)?;
9315                let offset = self.state.pop1()?.into_int_value();
9316                let memory_index = MemoryIndex::from_u32(memarg.memory);
9317
9318                let effective_address = self.resolve_memory_ptr(
9319                    memory_index,
9320                    memarg,
9321                    self.intrinsics.ptr_ty,
9322                    offset,
9323                    2,
9324                )?;
9325                let dead_load = err!(self.builder.build_load(
9326                    self.intrinsics.i16_ty,
9327                    effective_address,
9328                    ""
9329                ));
9330                self.annotate_user_memaccess(
9331                    memory_index,
9332                    memarg,
9333                    1,
9334                    dead_load.as_instruction_value().unwrap(),
9335                )?;
9336                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9337                let val = err!(self.builder.build_extract_element(v, idx, ""));
9338                let store = err!(self.builder.build_store(effective_address, val));
9339                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9340            }
9341            Operator::V128Store32Lane { ref memarg, lane } => {
9342                let (v, i) = self.state.pop1_extra()?;
9343                let (v, _i) = self.v128_into_i32x4(v, i)?;
9344                let offset = self.state.pop1()?.into_int_value();
9345                let memory_index = MemoryIndex::from_u32(memarg.memory);
9346
9347                let effective_address = self.resolve_memory_ptr(
9348                    memory_index,
9349                    memarg,
9350                    self.intrinsics.ptr_ty,
9351                    offset,
9352                    4,
9353                )?;
9354                let dead_load = err!(self.builder.build_load(
9355                    self.intrinsics.i32_ty,
9356                    effective_address,
9357                    ""
9358                ));
9359                self.annotate_user_memaccess(
9360                    memory_index,
9361                    memarg,
9362                    1,
9363                    dead_load.as_instruction_value().unwrap(),
9364                )?;
9365                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9366                let val = err!(self.builder.build_extract_element(v, idx, ""));
9367                let store = err!(self.builder.build_store(effective_address, val));
9368                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9369            }
9370            Operator::V128Store64Lane { ref memarg, lane } => {
9371                let (v, i) = self.state.pop1_extra()?;
9372                let (v, _i) = self.v128_into_i64x2(v, i)?;
9373                let offset = self.state.pop1()?.into_int_value();
9374                let memory_index = MemoryIndex::from_u32(memarg.memory);
9375
9376                let effective_address = self.resolve_memory_ptr(
9377                    memory_index,
9378                    memarg,
9379                    self.intrinsics.ptr_ty,
9380                    offset,
9381                    8,
9382                )?;
9383                let dead_load = err!(self.builder.build_load(
9384                    self.intrinsics.i64_ty,
9385                    effective_address,
9386                    ""
9387                ));
9388                self.annotate_user_memaccess(
9389                    memory_index,
9390                    memarg,
9391                    1,
9392                    dead_load.as_instruction_value().unwrap(),
9393                )?;
9394                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9395                let val = err!(self.builder.build_extract_element(v, idx, ""));
9396                let store = err!(self.builder.build_store(effective_address, val));
9397                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9398            }
9399            Operator::I32Load8S { ref memarg } => {
9400                let offset = self.state.pop1()?.into_int_value();
9401                let memory_index = MemoryIndex::from_u32(0);
9402                let effective_address = self.resolve_memory_ptr(
9403                    memory_index,
9404                    memarg,
9405                    self.intrinsics.ptr_ty,
9406                    offset,
9407                    1,
9408                )?;
9409                let narrow_result = err!(self.builder.build_load(
9410                    self.intrinsics.i8_ty,
9411                    effective_address,
9412                    ""
9413                ));
9414                self.annotate_user_memaccess(
9415                    memory_index,
9416                    memarg,
9417                    1,
9418                    narrow_result.as_instruction_value().unwrap(),
9419                )?;
9420                let result = err!(self.builder.build_int_s_extend(
9421                    narrow_result.into_int_value(),
9422                    self.intrinsics.i32_ty,
9423                    "",
9424                ));
9425                self.state.push1(result);
9426            }
9427            Operator::I32Load16S { ref memarg } => {
9428                let offset = self.state.pop1()?.into_int_value();
9429                let memory_index = MemoryIndex::from_u32(0);
9430                let effective_address = self.resolve_memory_ptr(
9431                    memory_index,
9432                    memarg,
9433                    self.intrinsics.ptr_ty,
9434                    offset,
9435                    2,
9436                )?;
9437                let narrow_result = err!(self.builder.build_load(
9438                    self.intrinsics.i16_ty,
9439                    effective_address,
9440                    ""
9441                ));
9442                self.annotate_user_memaccess(
9443                    memory_index,
9444                    memarg,
9445                    1,
9446                    narrow_result.as_instruction_value().unwrap(),
9447                )?;
9448                let result = err!(self.builder.build_int_s_extend(
9449                    narrow_result.into_int_value(),
9450                    self.intrinsics.i32_ty,
9451                    "",
9452                ));
9453                self.state.push1(result);
9454            }
9455            Operator::I64Load8S { ref memarg } => {
9456                let offset = self.state.pop1()?.into_int_value();
9457                let memory_index = MemoryIndex::from_u32(0);
9458                let effective_address = self.resolve_memory_ptr(
9459                    memory_index,
9460                    memarg,
9461                    self.intrinsics.ptr_ty,
9462                    offset,
9463                    1,
9464                )?;
9465                let narrow_result = err!(self.builder.build_load(
9466                    self.intrinsics.i8_ty,
9467                    effective_address,
9468                    ""
9469                ))
9470                .into_int_value();
9471                self.annotate_user_memaccess(
9472                    memory_index,
9473                    memarg,
9474                    1,
9475                    narrow_result.as_instruction_value().unwrap(),
9476                )?;
9477                let result = err!(self.builder.build_int_s_extend(
9478                    narrow_result,
9479                    self.intrinsics.i64_ty,
9480                    ""
9481                ));
9482                self.state.push1(result);
9483            }
9484            Operator::I64Load16S { ref memarg } => {
9485                let offset = self.state.pop1()?.into_int_value();
9486                let memory_index = MemoryIndex::from_u32(0);
9487                let effective_address = self.resolve_memory_ptr(
9488                    memory_index,
9489                    memarg,
9490                    self.intrinsics.ptr_ty,
9491                    offset,
9492                    2,
9493                )?;
9494                let narrow_result = err!(self.builder.build_load(
9495                    self.intrinsics.i16_ty,
9496                    effective_address,
9497                    ""
9498                ))
9499                .into_int_value();
9500                self.annotate_user_memaccess(
9501                    memory_index,
9502                    memarg,
9503                    1,
9504                    narrow_result.as_instruction_value().unwrap(),
9505                )?;
9506                let result = err!(self.builder.build_int_s_extend(
9507                    narrow_result,
9508                    self.intrinsics.i64_ty,
9509                    ""
9510                ));
9511                self.state.push1(result);
9512            }
9513            Operator::I64Load32S { ref memarg } => {
9514                let offset = self.state.pop1()?.into_int_value();
9515                let memory_index = MemoryIndex::from_u32(0);
9516                let effective_address = self.resolve_memory_ptr(
9517                    memory_index,
9518                    memarg,
9519                    self.intrinsics.ptr_ty,
9520                    offset,
9521                    4,
9522                )?;
9523                let narrow_result = err!(self.builder.build_load(
9524                    self.intrinsics.i32_ty,
9525                    effective_address,
9526                    ""
9527                ));
9528                self.annotate_user_memaccess(
9529                    memory_index,
9530                    memarg,
9531                    1,
9532                    narrow_result.as_instruction_value().unwrap(),
9533                )?;
9534                let result = err!(self.builder.build_int_s_extend(
9535                    narrow_result.into_int_value(),
9536                    self.intrinsics.i64_ty,
9537                    "",
9538                ));
9539                self.state.push1(result);
9540            }
9541
9542            Operator::I32Load8U { ref memarg } => {
9543                let offset = self.state.pop1()?.into_int_value();
9544                let memory_index = MemoryIndex::from_u32(0);
9545                let effective_address = self.resolve_memory_ptr(
9546                    memory_index,
9547                    memarg,
9548                    self.intrinsics.ptr_ty,
9549                    offset,
9550                    1,
9551                )?;
9552                let narrow_result = err!(self.builder.build_load(
9553                    self.intrinsics.i8_ty,
9554                    effective_address,
9555                    ""
9556                ));
9557                self.annotate_user_memaccess(
9558                    memory_index,
9559                    memarg,
9560                    1,
9561                    narrow_result.as_instruction_value().unwrap(),
9562                )?;
9563                let result = err!(self.builder.build_int_z_extend(
9564                    narrow_result.into_int_value(),
9565                    self.intrinsics.i32_ty,
9566                    "",
9567                ));
9568                self.state.push1_extra(result, ExtraInfo::arithmetic_f32());
9569            }
9570            Operator::I32Load16U { ref memarg } => {
9571                let offset = self.state.pop1()?.into_int_value();
9572                let memory_index = MemoryIndex::from_u32(0);
9573                let effective_address = self.resolve_memory_ptr(
9574                    memory_index,
9575                    memarg,
9576                    self.intrinsics.ptr_ty,
9577                    offset,
9578                    2,
9579                )?;
9580                let narrow_result = err!(self.builder.build_load(
9581                    self.intrinsics.i16_ty,
9582                    effective_address,
9583                    ""
9584                ));
9585                self.annotate_user_memaccess(
9586                    memory_index,
9587                    memarg,
9588                    1,
9589                    narrow_result.as_instruction_value().unwrap(),
9590                )?;
9591                let result = err!(self.builder.build_int_z_extend(
9592                    narrow_result.into_int_value(),
9593                    self.intrinsics.i32_ty,
9594                    "",
9595                ));
9596                self.state.push1_extra(result, ExtraInfo::arithmetic_f32());
9597            }
9598            Operator::I64Load8U { ref memarg } => {
9599                let offset = self.state.pop1()?.into_int_value();
9600                let memory_index = MemoryIndex::from_u32(0);
9601                let effective_address = self.resolve_memory_ptr(
9602                    memory_index,
9603                    memarg,
9604                    self.intrinsics.ptr_ty,
9605                    offset,
9606                    1,
9607                )?;
9608                let narrow_result = err!(self.builder.build_load(
9609                    self.intrinsics.i8_ty,
9610                    effective_address,
9611                    ""
9612                ));
9613                self.annotate_user_memaccess(
9614                    memory_index,
9615                    memarg,
9616                    1,
9617                    narrow_result.as_instruction_value().unwrap(),
9618                )?;
9619                let result = err!(self.builder.build_int_z_extend(
9620                    narrow_result.into_int_value(),
9621                    self.intrinsics.i64_ty,
9622                    "",
9623                ));
9624                self.state.push1_extra(result, ExtraInfo::arithmetic_f64());
9625            }
9626            Operator::I64Load16U { ref memarg } => {
9627                let offset = self.state.pop1()?.into_int_value();
9628                let memory_index = MemoryIndex::from_u32(0);
9629                let effective_address = self.resolve_memory_ptr(
9630                    memory_index,
9631                    memarg,
9632                    self.intrinsics.ptr_ty,
9633                    offset,
9634                    2,
9635                )?;
9636                let narrow_result = err!(self.builder.build_load(
9637                    self.intrinsics.i16_ty,
9638                    effective_address,
9639                    ""
9640                ));
9641                self.annotate_user_memaccess(
9642                    memory_index,
9643                    memarg,
9644                    1,
9645                    narrow_result.as_instruction_value().unwrap(),
9646                )?;
9647                let result = err!(self.builder.build_int_z_extend(
9648                    narrow_result.into_int_value(),
9649                    self.intrinsics.i64_ty,
9650                    "",
9651                ));
9652                self.state.push1_extra(result, ExtraInfo::arithmetic_f64());
9653            }
9654            Operator::I64Load32U { ref memarg } => {
9655                let offset = self.state.pop1()?.into_int_value();
9656                let memory_index = MemoryIndex::from_u32(0);
9657                let effective_address = self.resolve_memory_ptr(
9658                    memory_index,
9659                    memarg,
9660                    self.intrinsics.ptr_ty,
9661                    offset,
9662                    4,
9663                )?;
9664                let narrow_result = err!(self.builder.build_load(
9665                    self.intrinsics.i32_ty,
9666                    effective_address,
9667                    ""
9668                ));
9669                self.annotate_user_memaccess(
9670                    memory_index,
9671                    memarg,
9672                    1,
9673                    narrow_result.as_instruction_value().unwrap(),
9674                )?;
9675                let result = err!(self.builder.build_int_z_extend(
9676                    narrow_result.into_int_value(),
9677                    self.intrinsics.i64_ty,
9678                    "",
9679                ));
9680                self.state.push1_extra(result, ExtraInfo::arithmetic_f64());
9681            }
9682
9683            Operator::I32Store8 { ref memarg } | Operator::I64Store8 { ref memarg } => {
9684                let value = self.state.pop1()?.into_int_value();
9685                let offset = self.state.pop1()?.into_int_value();
9686                let memory_index = MemoryIndex::from_u32(0);
9687                let effective_address = self.resolve_memory_ptr(
9688                    memory_index,
9689                    memarg,
9690                    self.intrinsics.ptr_ty,
9691                    offset,
9692                    1,
9693                )?;
9694                let dead_load = err!(self.builder.build_load(
9695                    self.intrinsics.i8_ty,
9696                    effective_address,
9697                    ""
9698                ));
9699                self.annotate_user_memaccess(
9700                    memory_index,
9701                    memarg,
9702                    1,
9703                    dead_load.as_instruction_value().unwrap(),
9704                )?;
9705                let narrow_value = err!(self.builder.build_int_truncate(
9706                    value,
9707                    self.intrinsics.i8_ty,
9708                    ""
9709                ));
9710                let store = err!(self.builder.build_store(effective_address, narrow_value));
9711                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9712            }
9713            Operator::I32Store16 { ref memarg } | Operator::I64Store16 { ref memarg } => {
9714                let value = self.state.pop1()?.into_int_value();
9715                let offset = self.state.pop1()?.into_int_value();
9716                let memory_index = MemoryIndex::from_u32(0);
9717                let effective_address = self.resolve_memory_ptr(
9718                    memory_index,
9719                    memarg,
9720                    self.intrinsics.ptr_ty,
9721                    offset,
9722                    2,
9723                )?;
9724                let dead_load = err!(self.builder.build_load(
9725                    self.intrinsics.i16_ty,
9726                    effective_address,
9727                    ""
9728                ));
9729                self.annotate_user_memaccess(
9730                    memory_index,
9731                    memarg,
9732                    1,
9733                    dead_load.as_instruction_value().unwrap(),
9734                )?;
9735                let narrow_value = err!(self.builder.build_int_truncate(
9736                    value,
9737                    self.intrinsics.i16_ty,
9738                    ""
9739                ));
9740                let store = err!(self.builder.build_store(effective_address, narrow_value));
9741                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9742            }
9743            Operator::I64Store32 { ref memarg } => {
9744                let value = self.state.pop1()?.into_int_value();
9745                let offset = self.state.pop1()?.into_int_value();
9746                let memory_index = MemoryIndex::from_u32(0);
9747                let effective_address = self.resolve_memory_ptr(
9748                    memory_index,
9749                    memarg,
9750                    self.intrinsics.ptr_ty,
9751                    offset,
9752                    4,
9753                )?;
9754                let dead_load = err!(self.builder.build_load(
9755                    self.intrinsics.i32_ty,
9756                    effective_address,
9757                    ""
9758                ));
9759                self.annotate_user_memaccess(
9760                    memory_index,
9761                    memarg,
9762                    1,
9763                    dead_load.as_instruction_value().unwrap(),
9764                )?;
9765                let narrow_value = err!(self.builder.build_int_truncate(
9766                    value,
9767                    self.intrinsics.i32_ty,
9768                    ""
9769                ));
9770                let store = err!(self.builder.build_store(effective_address, narrow_value));
9771                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
9772            }
9773            Operator::I8x16Neg => {
9774                let (v, i) = self.state.pop1_extra()?;
9775                let (v, _) = self.v128_into_i8x16(v, i)?;
9776                let res = err!(self.builder.build_int_sub(v.get_type().const_zero(), v, ""));
9777                let res = err!(
9778                    self.builder
9779                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9780                );
9781                self.state.push1(res);
9782            }
9783            Operator::I16x8Neg => {
9784                let (v, i) = self.state.pop1_extra()?;
9785                let (v, _) = self.v128_into_i16x8(v, i)?;
9786                let res = err!(self.builder.build_int_sub(v.get_type().const_zero(), v, ""));
9787                let res = err!(
9788                    self.builder
9789                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9790                );
9791                self.state.push1(res);
9792            }
9793            Operator::I32x4Neg => {
9794                let (v, i) = self.state.pop1_extra()?;
9795                let (v, _) = self.v128_into_i32x4(v, i)?;
9796                let res = err!(self.builder.build_int_sub(v.get_type().const_zero(), v, ""));
9797                let res = err!(
9798                    self.builder
9799                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9800                );
9801                self.state.push1(res);
9802            }
9803            Operator::I64x2Neg => {
9804                let (v, i) = self.state.pop1_extra()?;
9805                let (v, _) = self.v128_into_i64x2(v, i)?;
9806                let res = err!(self.builder.build_int_sub(v.get_type().const_zero(), v, ""));
9807                let res = err!(
9808                    self.builder
9809                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9810                );
9811                self.state.push1(res);
9812            }
9813            Operator::V128Not => {
9814                let (v, i) = self.state.pop1_extra()?;
9815                let v = self.apply_pending_canonicalization(v, i)?.into_int_value();
9816                let res = err!(self.builder.build_not(v, ""));
9817                self.state.push1(res);
9818            }
9819            Operator::V128AnyTrue => {
9820                let v = self.state.pop1()?.into_int_value();
9823                let res = err!(self.builder.build_int_compare(
9824                    IntPredicate::NE,
9825                    v,
9826                    v.get_type().const_zero(),
9827                    "",
9828                ));
9829                let res = err!(
9830                    self.builder
9831                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
9832                );
9833                self.state.push1_extra(
9834                    res,
9835                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
9836                );
9837            }
9838            Operator::I8x16AllTrue
9839            | Operator::I16x8AllTrue
9840            | Operator::I32x4AllTrue
9841            | Operator::I64x2AllTrue => {
9842                let vec_ty = match op {
9843                    Operator::I8x16AllTrue => self.intrinsics.i8x16_ty,
9844                    Operator::I16x8AllTrue => self.intrinsics.i16x8_ty,
9845                    Operator::I32x4AllTrue => self.intrinsics.i32x4_ty,
9846                    Operator::I64x2AllTrue => self.intrinsics.i64x2_ty,
9847                    _ => unreachable!(),
9848                };
9849                let (v, i) = self.state.pop1_extra()?;
9850                let v = self.apply_pending_canonicalization(v, i)?.into_int_value();
9851                let lane_int_ty = self.context.custom_width_int_type(vec_ty.get_size());
9852                let vec = err!(self.builder.build_bit_cast(v, vec_ty, "vec")).into_vector_value();
9853                let mask = err!(self.builder.build_int_compare(
9854                    IntPredicate::NE,
9855                    vec,
9856                    vec_ty.const_zero(),
9857                    "mask",
9858                ));
9859                let cmask =
9860                    err!(self.builder.build_bit_cast(mask, lane_int_ty, "cmask")).into_int_value();
9861                let res = err!(self.builder.build_int_compare(
9862                    IntPredicate::EQ,
9863                    cmask,
9864                    lane_int_ty.const_int(u64::MAX, true),
9865                    "",
9866                ));
9867                let res = err!(
9868                    self.builder
9869                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
9870                );
9871                self.state.push1_extra(
9872                    res,
9873                    (ExtraInfo::arithmetic_f32() | ExtraInfo::arithmetic_f64())?,
9874                );
9875            }
9876            Operator::I8x16ExtractLaneS { lane } => {
9877                let (v, i) = self.state.pop1_extra()?;
9878                let (v, _) = self.v128_into_i8x16(v, i)?;
9879                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9880                let res = err!(self.builder.build_extract_element(v, idx, "")).into_int_value();
9881                let res = err!(
9882                    self.builder
9883                        .build_int_s_extend(res, self.intrinsics.i32_ty, "")
9884                );
9885                self.state.push1(res);
9886            }
9887            Operator::I8x16ExtractLaneU { lane } => {
9888                let (v, i) = self.state.pop1_extra()?;
9889                let (v, _) = self.v128_into_i8x16(v, i)?;
9890                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9891                let res = err!(self.builder.build_extract_element(v, idx, "")).into_int_value();
9892                let res = err!(
9893                    self.builder
9894                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
9895                );
9896                self.state.push1_extra(res, ExtraInfo::arithmetic_f32());
9897            }
9898            Operator::I16x8ExtractLaneS { lane } => {
9899                let (v, i) = self.state.pop1_extra()?;
9900                let (v, _) = self.v128_into_i16x8(v, i)?;
9901                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9902                let res = err!(self.builder.build_extract_element(v, idx, "")).into_int_value();
9903                let res = err!(
9904                    self.builder
9905                        .build_int_s_extend(res, self.intrinsics.i32_ty, "")
9906                );
9907                self.state.push1(res);
9908            }
9909            Operator::I16x8ExtractLaneU { lane } => {
9910                let (v, i) = self.state.pop1_extra()?;
9911                let (v, _) = self.v128_into_i16x8(v, i)?;
9912                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9913                let res = err!(self.builder.build_extract_element(v, idx, "")).into_int_value();
9914                let res = err!(
9915                    self.builder
9916                        .build_int_z_extend(res, self.intrinsics.i32_ty, "")
9917                );
9918                self.state.push1_extra(res, ExtraInfo::arithmetic_f32());
9919            }
9920            Operator::I32x4ExtractLane { lane } => {
9921                let (v, i) = self.state.pop1_extra()?;
9922                let (v, i) = self.v128_into_i32x4(v, i)?;
9923                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9924                let res = err!(self.builder.build_extract_element(v, idx, ""));
9925                self.state.push1_extra(res, i);
9926            }
9927            Operator::I64x2ExtractLane { lane } => {
9928                let (v, i) = self.state.pop1_extra()?;
9929                let (v, i) = self.v128_into_i64x2(v, i)?;
9930                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9931                let res = err!(self.builder.build_extract_element(v, idx, ""));
9932                self.state.push1_extra(res, i);
9933            }
9934            Operator::F32x4ExtractLane { lane } => {
9935                let (v, i) = self.state.pop1_extra()?;
9936                let (v, i) = self.v128_into_f32x4(v, i)?;
9937                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9938                let res = err!(self.builder.build_extract_element(v, idx, ""));
9939                self.state.push1_extra(res, i);
9940            }
9941            Operator::F64x2ExtractLane { lane } => {
9942                let (v, i) = self.state.pop1_extra()?;
9943                let (v, i) = self.v128_into_f64x2(v, i)?;
9944                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9945                let res = err!(self.builder.build_extract_element(v, idx, ""));
9946                self.state.push1_extra(res, i);
9947            }
9948            Operator::I8x16ReplaceLane { lane } => {
9949                let ((v1, i1), (v2, _)) = self.state.pop2_extra()?;
9950                let (v1, _) = self.v128_into_i8x16(v1, i1)?;
9951                let v2 = v2.into_int_value();
9952                let v2 = err!(self.builder.build_int_cast(v2, self.intrinsics.i8_ty, ""));
9953                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9954                let res = err!(self.builder.build_insert_element(v1, v2, idx, ""));
9955                let res = err!(
9956                    self.builder
9957                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9958                );
9959                self.state.push1(res);
9960            }
9961            Operator::I16x8ReplaceLane { lane } => {
9962                let ((v1, i1), (v2, _)) = self.state.pop2_extra()?;
9963                let (v1, _) = self.v128_into_i16x8(v1, i1)?;
9964                let v2 = v2.into_int_value();
9965                let v2 = err!(self.builder.build_int_cast(v2, self.intrinsics.i16_ty, ""));
9966                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9967                let res = err!(self.builder.build_insert_element(v1, v2, idx, ""));
9968                let res = err!(
9969                    self.builder
9970                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9971                );
9972                self.state.push1(res);
9973            }
9974            Operator::I32x4ReplaceLane { lane } => {
9975                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
9976                let (v1, i1) = self.v128_into_i32x4(v1, i1)?;
9977                let v2 = self.apply_pending_canonicalization(v2, i2)?;
9978                let v2 = v2.into_int_value();
9979                let i2 = i2.strip_pending();
9980                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9981                let res = err!(self.builder.build_insert_element(v1, v2, idx, ""));
9982                let res = err!(
9983                    self.builder
9984                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
9985                );
9986                self.state
9987                    .push1_extra(res, ((i1 & i2)? & ExtraInfo::arithmetic_f32())?);
9988            }
9989            Operator::I64x2ReplaceLane { lane } => {
9990                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
9991                let (v1, i1) = self.v128_into_i64x2(v1, i1)?;
9992                let v2 = self.apply_pending_canonicalization(v2, i2)?;
9993                let v2 = v2.into_int_value();
9994                let i2 = i2.strip_pending();
9995                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
9996                let res = err!(self.builder.build_insert_element(v1, v2, idx, ""));
9997                let res = err!(
9998                    self.builder
9999                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10000                );
10001                self.state
10002                    .push1_extra(res, ((i1 & i2)? & ExtraInfo::arithmetic_f64())?);
10003            }
10004            Operator::F32x4ReplaceLane { lane } => {
10005                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
10006                let (v1, i1) = self.v128_into_f32x4(v1, i1)?;
10007                let push_pending_f32_nan_to_result =
10008                    i1.has_pending_f32_nan() && i2.has_pending_f32_nan();
10009                let (v1, v2) = if !push_pending_f32_nan_to_result {
10010                    (
10011                        self.apply_pending_canonicalization(v1.as_basic_value_enum(), i1)?
10012                            .into_vector_value(),
10013                        self.apply_pending_canonicalization(v2.as_basic_value_enum(), i2)?
10014                            .into_float_value(),
10015                    )
10016                } else {
10017                    (v1, v2.into_float_value())
10018                };
10019                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
10020                let res = err!(self.builder.build_insert_element(v1, v2, idx, ""));
10021                let res = err!(
10022                    self.builder
10023                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10024                );
10025                let info = if push_pending_f32_nan_to_result {
10026                    ExtraInfo::pending_f32_nan()
10027                } else {
10028                    (i1.strip_pending() & i2.strip_pending())?
10029                };
10030                self.state.push1_extra(res, info);
10031            }
10032            Operator::F64x2ReplaceLane { lane } => {
10033                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
10034                let (v1, i1) = self.v128_into_f64x2(v1, i1)?;
10035                let push_pending_f64_nan_to_result =
10036                    i1.has_pending_f64_nan() && i2.has_pending_f64_nan();
10037                let (v1, v2) = if !push_pending_f64_nan_to_result {
10038                    (
10039                        self.apply_pending_canonicalization(v1.as_basic_value_enum(), i1)?
10040                            .into_vector_value(),
10041                        self.apply_pending_canonicalization(v2.as_basic_value_enum(), i2)?
10042                            .into_float_value(),
10043                    )
10044                } else {
10045                    (v1, v2.into_float_value())
10046                };
10047                let idx = self.intrinsics.i32_ty.const_int(lane.into(), false);
10048                let res = err!(self.builder.build_insert_element(v1, v2, idx, ""));
10049                let res = err!(
10050                    self.builder
10051                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10052                );
10053                let info = if push_pending_f64_nan_to_result {
10054                    ExtraInfo::pending_f64_nan()
10055                } else {
10056                    (i1.strip_pending() & i2.strip_pending())?
10057                };
10058                self.state.push1_extra(res, info);
10059            }
10060            Operator::I8x16Swizzle => {
10061                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
10062                let v1 = self.apply_pending_canonicalization(v1, i1)?;
10063                let v1 = err!(
10064                    self.builder
10065                        .build_bit_cast(v1, self.intrinsics.i8x16_ty, "")
10066                )
10067                .into_vector_value();
10068                let v2 = self.apply_pending_canonicalization(v2, i2)?;
10069                let v2 = err!(
10070                    self.builder
10071                        .build_bit_cast(v2, self.intrinsics.i8x16_ty, "")
10072                )
10073                .into_vector_value();
10074                let lanes = self.intrinsics.i8_ty.const_int(16, false);
10075                let lanes =
10076                    self.splat_vector(lanes.as_basic_value_enum(), self.intrinsics.i8x16_ty)?;
10077                let mut res = self.intrinsics.i8x16_ty.get_undef();
10078                let idx_out_of_range = err!(self.builder.build_int_compare(
10079                    IntPredicate::UGE,
10080                    v2,
10081                    lanes,
10082                    "idx_out_of_range",
10083                ));
10084                let idx_clamped = err!(self.builder.build_select(
10085                    idx_out_of_range,
10086                    self.intrinsics.i8x16_ty.const_zero(),
10087                    v2,
10088                    "idx_clamped",
10089                ))
10090                .into_vector_value();
10091                for i in 0..16 {
10092                    let idx = err!(self.builder.build_extract_element(
10093                        idx_clamped,
10094                        self.intrinsics.i32_ty.const_int(i, false),
10095                        "idx",
10096                    ))
10097                    .into_int_value();
10098                    let replace_with_zero = err!(self.builder.build_extract_element(
10099                        idx_out_of_range,
10100                        self.intrinsics.i32_ty.const_int(i, false),
10101                        "replace_with_zero",
10102                    ))
10103                    .into_int_value();
10104                    let elem =
10105                        err!(self.builder.build_extract_element(v1, idx, "elem")).into_int_value();
10106                    let elem_or_zero = err!(self.builder.build_select(
10107                        replace_with_zero,
10108                        self.intrinsics.i8_zero,
10109                        elem,
10110                        "elem_or_zero",
10111                    ));
10112                    res = err!(self.builder.build_insert_element(
10113                        res,
10114                        elem_or_zero,
10115                        self.intrinsics.i32_ty.const_int(i, false),
10116                        "",
10117                    ));
10118                }
10119                let res = err!(
10120                    self.builder
10121                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10122                );
10123                self.state.push1(res);
10124            }
10125            Operator::I8x16Shuffle { lanes } => {
10126                let ((v1, i1), (v2, i2)) = self.state.pop2_extra()?;
10127                let v1 = self.apply_pending_canonicalization(v1, i1)?;
10128                let v1 = err!(
10129                    self.builder
10130                        .build_bit_cast(v1, self.intrinsics.i8x16_ty, "")
10131                )
10132                .into_vector_value();
10133                let v2 = self.apply_pending_canonicalization(v2, i2)?;
10134                let v2 = err!(
10135                    self.builder
10136                        .build_bit_cast(v2, self.intrinsics.i8x16_ty, "")
10137                )
10138                .into_vector_value();
10139                let mask = VectorType::const_vector(
10140                    lanes
10141                        .iter()
10142                        .map(|l| self.intrinsics.i32_ty.const_int((*l).into(), false))
10143                        .collect::<Vec<IntValue>>()
10144                        .as_slice(),
10145                );
10146                let res = err!(self.builder.build_shuffle_vector(v1, v2, mask, ""));
10147                let res = err!(
10148                    self.builder
10149                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10150                );
10151                self.state.push1(res);
10152            }
10153            Operator::V128Load8x8S { ref memarg } => {
10154                let offset = self.state.pop1()?.into_int_value();
10155                let memory_index = MemoryIndex::from_u32(0);
10156                let effective_address = self.resolve_memory_ptr(
10157                    memory_index,
10158                    memarg,
10159                    self.intrinsics.ptr_ty,
10160                    offset,
10161                    8,
10162                )?;
10163                let v = err!(self.builder.build_load(
10164                    self.intrinsics.i64_ty,
10165                    effective_address,
10166                    ""
10167                ));
10168                let v = err!(
10169                    self.builder
10170                        .build_bit_cast(v, self.intrinsics.i8_ty.vec_type(8), "")
10171                )
10172                .into_vector_value();
10173                let res = err!(
10174                    self.builder
10175                        .build_int_s_extend(v, self.intrinsics.i16x8_ty, "")
10176                );
10177                let res = err!(
10178                    self.builder
10179                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10180                );
10181                self.state.push1(res);
10182            }
10183            Operator::V128Load8x8U { ref memarg } => {
10184                let offset = self.state.pop1()?.into_int_value();
10185                let memory_index = MemoryIndex::from_u32(0);
10186                let effective_address = self.resolve_memory_ptr(
10187                    memory_index,
10188                    memarg,
10189                    self.intrinsics.ptr_ty,
10190                    offset,
10191                    8,
10192                )?;
10193                let v = err!(self.builder.build_load(
10194                    self.intrinsics.i64_ty,
10195                    effective_address,
10196                    ""
10197                ));
10198                let v = err!(
10199                    self.builder
10200                        .build_bit_cast(v, self.intrinsics.i8_ty.vec_type(8), "")
10201                )
10202                .into_vector_value();
10203                let res = err!(
10204                    self.builder
10205                        .build_int_z_extend(v, self.intrinsics.i16x8_ty, "")
10206                );
10207                let res = err!(
10208                    self.builder
10209                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10210                );
10211                self.state.push1(res);
10212            }
10213            Operator::V128Load16x4S { ref memarg } => {
10214                let offset = self.state.pop1()?.into_int_value();
10215                let memory_index = MemoryIndex::from_u32(0);
10216                let effective_address = self.resolve_memory_ptr(
10217                    memory_index,
10218                    memarg,
10219                    self.intrinsics.ptr_ty,
10220                    offset,
10221                    8,
10222                )?;
10223                let v = err!(self.builder.build_load(
10224                    self.intrinsics.i64_ty,
10225                    effective_address,
10226                    ""
10227                ));
10228                let v = err!(self.builder.build_bit_cast(
10229                    v,
10230                    self.intrinsics.i16_ty.vec_type(4),
10231                    ""
10232                ))
10233                .into_vector_value();
10234                let res = err!(
10235                    self.builder
10236                        .build_int_s_extend(v, self.intrinsics.i32x4_ty, "")
10237                );
10238                let res = err!(
10239                    self.builder
10240                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10241                );
10242                self.state.push1(res);
10243            }
10244            Operator::V128Load16x4U { ref memarg } => {
10245                let offset = self.state.pop1()?.into_int_value();
10246                let memory_index = MemoryIndex::from_u32(0);
10247                let effective_address = self.resolve_memory_ptr(
10248                    memory_index,
10249                    memarg,
10250                    self.intrinsics.ptr_ty,
10251                    offset,
10252                    8,
10253                )?;
10254                let v = err!(self.builder.build_load(
10255                    self.intrinsics.i64_ty,
10256                    effective_address,
10257                    ""
10258                ));
10259                let v = err!(self.builder.build_bit_cast(
10260                    v,
10261                    self.intrinsics.i16_ty.vec_type(4),
10262                    ""
10263                ))
10264                .into_vector_value();
10265                let res = err!(
10266                    self.builder
10267                        .build_int_z_extend(v, self.intrinsics.i32x4_ty, "")
10268                );
10269                let res = err!(
10270                    self.builder
10271                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10272                );
10273                self.state.push1(res);
10274            }
10275            Operator::V128Load32x2S { ref memarg } => {
10276                let offset = self.state.pop1()?.into_int_value();
10277                let memory_index = MemoryIndex::from_u32(0);
10278                let effective_address = self.resolve_memory_ptr(
10279                    memory_index,
10280                    memarg,
10281                    self.intrinsics.ptr_ty,
10282                    offset,
10283                    8,
10284                )?;
10285                let v = err!(self.builder.build_load(
10286                    self.intrinsics.i64_ty,
10287                    effective_address,
10288                    ""
10289                ));
10290                let v = err!(self.builder.build_bit_cast(
10291                    v,
10292                    self.intrinsics.i32_ty.vec_type(2),
10293                    ""
10294                ))
10295                .into_vector_value();
10296                let res = err!(
10297                    self.builder
10298                        .build_int_s_extend(v, self.intrinsics.i64x2_ty, "")
10299                );
10300                let res = err!(
10301                    self.builder
10302                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10303                );
10304                self.state.push1(res);
10305            }
10306            Operator::V128Load32x2U { ref memarg } => {
10307                let offset = self.state.pop1()?.into_int_value();
10308                let memory_index = MemoryIndex::from_u32(0);
10309                let effective_address = self.resolve_memory_ptr(
10310                    memory_index,
10311                    memarg,
10312                    self.intrinsics.ptr_ty,
10313                    offset,
10314                    8,
10315                )?;
10316                let v = err!(self.builder.build_load(
10317                    self.intrinsics.i64_ty,
10318                    effective_address,
10319                    ""
10320                ));
10321                let v = err!(self.builder.build_bit_cast(
10322                    v,
10323                    self.intrinsics.i32_ty.vec_type(2),
10324                    ""
10325                ))
10326                .into_vector_value();
10327                let res = err!(
10328                    self.builder
10329                        .build_int_z_extend(v, self.intrinsics.i64x2_ty, "")
10330                );
10331                let res = err!(
10332                    self.builder
10333                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10334                );
10335                self.state.push1(res);
10336            }
10337            Operator::V128Load32Zero { ref memarg } => {
10338                let offset = self.state.pop1()?.into_int_value();
10339                let memory_index = MemoryIndex::from_u32(0);
10340                let effective_address = self.resolve_memory_ptr(
10341                    memory_index,
10342                    memarg,
10343                    self.intrinsics.ptr_ty,
10344                    offset,
10345                    4,
10346                )?;
10347                let elem = err!(self.builder.build_load(
10348                    self.intrinsics.i32_ty,
10349                    effective_address,
10350                    ""
10351                ));
10352                self.annotate_user_memaccess(
10353                    memory_index,
10354                    memarg,
10355                    1,
10356                    elem.as_instruction_value().unwrap(),
10357                )?;
10358                let res = err!(self.builder.build_int_z_extend(
10359                    elem.into_int_value(),
10360                    self.intrinsics.i128_ty,
10361                    "",
10362                ));
10363                self.state.push1(res);
10364            }
10365            Operator::V128Load64Zero { ref memarg } => {
10366                let offset = self.state.pop1()?.into_int_value();
10367                let memory_index = MemoryIndex::from_u32(0);
10368                let effective_address = self.resolve_memory_ptr(
10369                    memory_index,
10370                    memarg,
10371                    self.intrinsics.ptr_ty,
10372                    offset,
10373                    8,
10374                )?;
10375                let elem = err!(self.builder.build_load(
10376                    self.intrinsics.i64_ty,
10377                    effective_address,
10378                    ""
10379                ));
10380                self.annotate_user_memaccess(
10381                    memory_index,
10382                    memarg,
10383                    1,
10384                    elem.as_instruction_value().unwrap(),
10385                )?;
10386                let res = err!(self.builder.build_int_z_extend(
10387                    elem.into_int_value(),
10388                    self.intrinsics.i128_ty,
10389                    "",
10390                ));
10391                self.state.push1(res);
10392            }
10393            Operator::V128Load8Splat { ref memarg } => {
10394                let offset = self.state.pop1()?.into_int_value();
10395                let memory_index = MemoryIndex::from_u32(0);
10396                let effective_address = self.resolve_memory_ptr(
10397                    memory_index,
10398                    memarg,
10399                    self.intrinsics.ptr_ty,
10400                    offset,
10401                    1,
10402                )?;
10403                let elem = err!(self.builder.build_load(
10404                    self.intrinsics.i8_ty,
10405                    effective_address,
10406                    ""
10407                ));
10408                self.annotate_user_memaccess(
10409                    memory_index,
10410                    memarg,
10411                    1,
10412                    elem.as_instruction_value().unwrap(),
10413                )?;
10414                let res = self.splat_vector(elem, self.intrinsics.i8x16_ty)?;
10415                let res = err!(
10416                    self.builder
10417                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10418                );
10419                self.state.push1(res);
10420            }
10421            Operator::V128Load16Splat { ref memarg } => {
10422                let offset = self.state.pop1()?.into_int_value();
10423                let memory_index = MemoryIndex::from_u32(0);
10424                let effective_address = self.resolve_memory_ptr(
10425                    memory_index,
10426                    memarg,
10427                    self.intrinsics.ptr_ty,
10428                    offset,
10429                    2,
10430                )?;
10431                let elem = err!(self.builder.build_load(
10432                    self.intrinsics.i16_ty,
10433                    effective_address,
10434                    ""
10435                ));
10436                self.annotate_user_memaccess(
10437                    memory_index,
10438                    memarg,
10439                    1,
10440                    elem.as_instruction_value().unwrap(),
10441                )?;
10442                let res = self.splat_vector(elem, self.intrinsics.i16x8_ty)?;
10443                let res = err!(
10444                    self.builder
10445                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10446                );
10447                self.state.push1(res);
10448            }
10449            Operator::V128Load32Splat { ref memarg } => {
10450                let offset = self.state.pop1()?.into_int_value();
10451                let memory_index = MemoryIndex::from_u32(0);
10452                let effective_address = self.resolve_memory_ptr(
10453                    memory_index,
10454                    memarg,
10455                    self.intrinsics.ptr_ty,
10456                    offset,
10457                    4,
10458                )?;
10459                let elem = err!(self.builder.build_load(
10460                    self.intrinsics.i32_ty,
10461                    effective_address,
10462                    ""
10463                ));
10464                self.annotate_user_memaccess(
10465                    memory_index,
10466                    memarg,
10467                    1,
10468                    elem.as_instruction_value().unwrap(),
10469                )?;
10470                let res = self.splat_vector(elem, self.intrinsics.i32x4_ty)?;
10471                let res = err!(
10472                    self.builder
10473                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10474                );
10475                self.state.push1(res);
10476            }
10477            Operator::V128Load64Splat { ref memarg } => {
10478                let offset = self.state.pop1()?.into_int_value();
10479                let memory_index = MemoryIndex::from_u32(0);
10480                let effective_address = self.resolve_memory_ptr(
10481                    memory_index,
10482                    memarg,
10483                    self.intrinsics.ptr_ty,
10484                    offset,
10485                    8,
10486                )?;
10487                let elem = err!(self.builder.build_load(
10488                    self.intrinsics.i64_ty,
10489                    effective_address,
10490                    ""
10491                ));
10492                self.annotate_user_memaccess(
10493                    memory_index,
10494                    memarg,
10495                    1,
10496                    elem.as_instruction_value().unwrap(),
10497                )?;
10498                let res = self.splat_vector(elem, self.intrinsics.i64x2_ty)?;
10499                let res = err!(
10500                    self.builder
10501                        .build_bit_cast(res, self.intrinsics.i128_ty, "")
10502                );
10503                self.state.push1(res);
10504            }
10505            Operator::AtomicFence => {
10506                }
10514            Operator::I32AtomicLoad { ref memarg } => {
10515                let offset = self.state.pop1()?.into_int_value();
10516                let memory_index = MemoryIndex::from_u32(0);
10517                let effective_address = self.resolve_memory_ptr(
10518                    memory_index,
10519                    memarg,
10520                    self.intrinsics.ptr_ty,
10521                    offset,
10522                    4,
10523                )?;
10524                self.trap_if_misaligned(memarg, effective_address, 4)?;
10525                let result = err!(self.builder.build_load(
10526                    self.intrinsics.i32_ty,
10527                    effective_address,
10528                    "atomic_load"
10529                ));
10530                let load = result.as_instruction_value().unwrap();
10531                self.annotate_user_memaccess(memory_index, memarg, 4, load)?;
10532                load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10533                    .unwrap();
10534                self.state.push1(result);
10535            }
10536            Operator::I64AtomicLoad { ref memarg } => {
10537                let offset = self.state.pop1()?.into_int_value();
10538                let memory_index = MemoryIndex::from_u32(0);
10539                let effective_address = self.resolve_memory_ptr(
10540                    memory_index,
10541                    memarg,
10542                    self.intrinsics.ptr_ty,
10543                    offset,
10544                    8,
10545                )?;
10546                self.trap_if_misaligned(memarg, effective_address, 8)?;
10547                let result = err!(self.builder.build_load(
10548                    self.intrinsics.i64_ty,
10549                    effective_address,
10550                    ""
10551                ));
10552                let load = result.as_instruction_value().unwrap();
10553                self.annotate_user_memaccess(memory_index, memarg, 8, load)?;
10554                load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10555                    .unwrap();
10556                self.state.push1(result);
10557            }
10558            Operator::I32AtomicLoad8U { ref memarg } => {
10559                let offset = self.state.pop1()?.into_int_value();
10560                let memory_index = MemoryIndex::from_u32(0);
10561                let effective_address = self.resolve_memory_ptr(
10562                    memory_index,
10563                    memarg,
10564                    self.intrinsics.ptr_ty,
10565                    offset,
10566                    1,
10567                )?;
10568                self.trap_if_misaligned(memarg, effective_address, 1)?;
10569                let narrow_result = err!(self.builder.build_load(
10570                    self.intrinsics.i8_ty,
10571                    effective_address,
10572                    ""
10573                ))
10574                .into_int_value();
10575                let load = narrow_result.as_instruction_value().unwrap();
10576                self.annotate_user_memaccess(memory_index, memarg, 1, load)?;
10577                load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10578                    .unwrap();
10579                let result = err!(self.builder.build_int_z_extend(
10580                    narrow_result,
10581                    self.intrinsics.i32_ty,
10582                    ""
10583                ));
10584                self.state.push1_extra(result, ExtraInfo::arithmetic_f32());
10585            }
10586            Operator::I32AtomicLoad16U { ref memarg } => {
10587                let offset = self.state.pop1()?.into_int_value();
10588                let memory_index = MemoryIndex::from_u32(0);
10589                let effective_address = self.resolve_memory_ptr(
10590                    memory_index,
10591                    memarg,
10592                    self.intrinsics.ptr_ty,
10593                    offset,
10594                    2,
10595                )?;
10596                self.trap_if_misaligned(memarg, effective_address, 2)?;
10597                let narrow_result = err!(self.builder.build_load(
10598                    self.intrinsics.i16_ty,
10599                    effective_address,
10600                    ""
10601                ))
10602                .into_int_value();
10603                let load = narrow_result.as_instruction_value().unwrap();
10604                self.annotate_user_memaccess(memory_index, memarg, 2, load)?;
10605                load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10606                    .unwrap();
10607                let result = err!(self.builder.build_int_z_extend(
10608                    narrow_result,
10609                    self.intrinsics.i32_ty,
10610                    ""
10611                ));
10612                self.state.push1_extra(result, ExtraInfo::arithmetic_f32());
10613            }
10614            Operator::I64AtomicLoad8U { ref memarg } => {
10615                let offset = self.state.pop1()?.into_int_value();
10616                let memory_index = MemoryIndex::from_u32(0);
10617                let effective_address = self.resolve_memory_ptr(
10618                    memory_index,
10619                    memarg,
10620                    self.intrinsics.ptr_ty,
10621                    offset,
10622                    1,
10623                )?;
10624                self.trap_if_misaligned(memarg, effective_address, 1)?;
10625                let narrow_result = err!(self.builder.build_load(
10626                    self.intrinsics.i8_ty,
10627                    effective_address,
10628                    ""
10629                ))
10630                .into_int_value();
10631                let load = narrow_result.as_instruction_value().unwrap();
10632                self.annotate_user_memaccess(memory_index, memarg, 1, load)?;
10633                load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10634                    .unwrap();
10635                let result = err!(self.builder.build_int_z_extend(
10636                    narrow_result,
10637                    self.intrinsics.i64_ty,
10638                    ""
10639                ));
10640                self.state.push1_extra(result, ExtraInfo::arithmetic_f64());
10641            }
10642            Operator::I64AtomicLoad16U { ref memarg } => {
10643                let offset = self.state.pop1()?.into_int_value();
10644                let memory_index = MemoryIndex::from_u32(0);
10645                let effective_address = self.resolve_memory_ptr(
10646                    memory_index,
10647                    memarg,
10648                    self.intrinsics.ptr_ty,
10649                    offset,
10650                    2,
10651                )?;
10652                self.trap_if_misaligned(memarg, effective_address, 2)?;
10653                let narrow_result = err!(self.builder.build_load(
10654                    self.intrinsics.i16_ty,
10655                    effective_address,
10656                    ""
10657                ))
10658                .into_int_value();
10659                let load = narrow_result.as_instruction_value().unwrap();
10660                self.annotate_user_memaccess(memory_index, memarg, 2, load)?;
10661                load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10662                    .unwrap();
10663                let result = err!(self.builder.build_int_z_extend(
10664                    narrow_result,
10665                    self.intrinsics.i64_ty,
10666                    ""
10667                ));
10668                self.state.push1_extra(result, ExtraInfo::arithmetic_f64());
10669            }
10670            Operator::I64AtomicLoad32U { ref memarg } => {
10671                let offset = self.state.pop1()?.into_int_value();
10672                let memory_index = MemoryIndex::from_u32(0);
10673                let effective_address = self.resolve_memory_ptr(
10674                    memory_index,
10675                    memarg,
10676                    self.intrinsics.ptr_ty,
10677                    offset,
10678                    4,
10679                )?;
10680                self.trap_if_misaligned(memarg, effective_address, 4)?;
10681                let narrow_result = err!(self.builder.build_load(
10682                    self.intrinsics.i32_ty,
10683                    effective_address,
10684                    ""
10685                ))
10686                .into_int_value();
10687                let load = narrow_result.as_instruction_value().unwrap();
10688                self.annotate_user_memaccess(memory_index, memarg, 4, load)?;
10689                load.set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10690                    .unwrap();
10691                let result = err!(self.builder.build_int_z_extend(
10692                    narrow_result,
10693                    self.intrinsics.i64_ty,
10694                    ""
10695                ));
10696                self.state.push1_extra(result, ExtraInfo::arithmetic_f64());
10697            }
10698            Operator::I32AtomicStore { ref memarg } => {
10699                let value = self.state.pop1()?;
10700                let offset = self.state.pop1()?.into_int_value();
10701                let memory_index = MemoryIndex::from_u32(0);
10702                let effective_address = self.resolve_memory_ptr(
10703                    memory_index,
10704                    memarg,
10705                    self.intrinsics.ptr_ty,
10706                    offset,
10707                    4,
10708                )?;
10709                self.trap_if_misaligned(memarg, effective_address, 4)?;
10710                let store = err!(self.builder.build_store(effective_address, value));
10711                self.annotate_user_memaccess(memory_index, memarg, 4, store)?;
10712                store
10713                    .set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10714                    .unwrap();
10715            }
10716            Operator::I64AtomicStore { ref memarg } => {
10717                let value = self.state.pop1()?;
10718                let offset = self.state.pop1()?.into_int_value();
10719                let memory_index = MemoryIndex::from_u32(0);
10720                let effective_address = self.resolve_memory_ptr(
10721                    memory_index,
10722                    memarg,
10723                    self.intrinsics.ptr_ty,
10724                    offset,
10725                    8,
10726                )?;
10727                self.trap_if_misaligned(memarg, effective_address, 8)?;
10728                let store = err!(self.builder.build_store(effective_address, value));
10729                self.annotate_user_memaccess(memory_index, memarg, 8, store)?;
10730                store
10731                    .set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10732                    .unwrap();
10733            }
10734            Operator::I32AtomicStore8 { ref memarg } | Operator::I64AtomicStore8 { ref memarg } => {
10735                let value = self.state.pop1()?.into_int_value();
10736                let offset = self.state.pop1()?.into_int_value();
10737                let memory_index = MemoryIndex::from_u32(0);
10738                let effective_address = self.resolve_memory_ptr(
10739                    memory_index,
10740                    memarg,
10741                    self.intrinsics.ptr_ty,
10742                    offset,
10743                    1,
10744                )?;
10745                self.trap_if_misaligned(memarg, effective_address, 1)?;
10746                let narrow_value = err!(self.builder.build_int_truncate(
10747                    value,
10748                    self.intrinsics.i8_ty,
10749                    ""
10750                ));
10751                let store = err!(self.builder.build_store(effective_address, narrow_value));
10752                self.annotate_user_memaccess(memory_index, memarg, 1, store)?;
10753                store
10754                    .set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10755                    .unwrap();
10756            }
10757            Operator::I32AtomicStore16 { ref memarg }
10758            | Operator::I64AtomicStore16 { ref memarg } => {
10759                let value = self.state.pop1()?.into_int_value();
10760                let offset = self.state.pop1()?.into_int_value();
10761                let memory_index = MemoryIndex::from_u32(0);
10762                let effective_address = self.resolve_memory_ptr(
10763                    memory_index,
10764                    memarg,
10765                    self.intrinsics.ptr_ty,
10766                    offset,
10767                    2,
10768                )?;
10769                self.trap_if_misaligned(memarg, effective_address, 2)?;
10770                let narrow_value = err!(self.builder.build_int_truncate(
10771                    value,
10772                    self.intrinsics.i16_ty,
10773                    ""
10774                ));
10775                let store = err!(self.builder.build_store(effective_address, narrow_value));
10776                self.annotate_user_memaccess(memory_index, memarg, 2, store)?;
10777                store
10778                    .set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10779                    .unwrap();
10780            }
10781            Operator::I64AtomicStore32 { ref memarg } => {
10782                let value = self.state.pop1()?.into_int_value();
10783                let offset = self.state.pop1()?.into_int_value();
10784                let memory_index = MemoryIndex::from_u32(0);
10785                let effective_address = self.resolve_memory_ptr(
10786                    memory_index,
10787                    memarg,
10788                    self.intrinsics.ptr_ty,
10789                    offset,
10790                    4,
10791                )?;
10792                self.trap_if_misaligned(memarg, effective_address, 4)?;
10793                let narrow_value = err!(self.builder.build_int_truncate(
10794                    value,
10795                    self.intrinsics.i32_ty,
10796                    ""
10797                ));
10798                let store = err!(self.builder.build_store(effective_address, narrow_value));
10799                self.annotate_user_memaccess(memory_index, memarg, 4, store)?;
10800                store
10801                    .set_atomic_ordering(AtomicOrdering::SequentiallyConsistent)
10802                    .unwrap();
10803            }
10804            Operator::I32AtomicRmw8AddU { ref memarg } => {
10805                let value = self.state.pop1()?.into_int_value();
10806                let offset = self.state.pop1()?.into_int_value();
10807                let memory_index = MemoryIndex::from_u32(0);
10808                let effective_address = self.resolve_memory_ptr(
10809                    memory_index,
10810                    memarg,
10811                    self.intrinsics.ptr_ty,
10812                    offset,
10813                    1,
10814                )?;
10815                self.trap_if_misaligned(memarg, effective_address, 1)?;
10816                let narrow_value = err!(self.builder.build_int_truncate(
10817                    value,
10818                    self.intrinsics.i8_ty,
10819                    ""
10820                ));
10821                let old = self
10822                    .builder
10823                    .build_atomicrmw(
10824                        AtomicRMWBinOp::Add,
10825                        effective_address,
10826                        narrow_value,
10827                        AtomicOrdering::SequentiallyConsistent,
10828                    )
10829                    .unwrap();
10830                tbaa_label(
10831                    self.module,
10832                    self.intrinsics,
10833                    format!("memory {}", memory_index.as_u32()),
10834                    old.as_instruction_value().unwrap(),
10835                );
10836                let old = err!(
10837                    self.builder
10838                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
10839                );
10840                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
10841            }
10842            Operator::I32AtomicRmw16AddU { ref memarg } => {
10843                let value = self.state.pop1()?.into_int_value();
10844                let offset = self.state.pop1()?.into_int_value();
10845                let memory_index = MemoryIndex::from_u32(0);
10846                let effective_address = self.resolve_memory_ptr(
10847                    memory_index,
10848                    memarg,
10849                    self.intrinsics.ptr_ty,
10850                    offset,
10851                    2,
10852                )?;
10853                self.trap_if_misaligned(memarg, effective_address, 2)?;
10854                let narrow_value = err!(self.builder.build_int_truncate(
10855                    value,
10856                    self.intrinsics.i16_ty,
10857                    ""
10858                ));
10859                let old = self
10860                    .builder
10861                    .build_atomicrmw(
10862                        AtomicRMWBinOp::Add,
10863                        effective_address,
10864                        narrow_value,
10865                        AtomicOrdering::SequentiallyConsistent,
10866                    )
10867                    .unwrap();
10868                tbaa_label(
10869                    self.module,
10870                    self.intrinsics,
10871                    format!("memory {}", memory_index.as_u32()),
10872                    old.as_instruction_value().unwrap(),
10873                );
10874                let old = err!(
10875                    self.builder
10876                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
10877                );
10878                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
10879            }
10880            Operator::I32AtomicRmwAdd { ref memarg } => {
10881                let value = self.state.pop1()?.into_int_value();
10882                let offset = self.state.pop1()?.into_int_value();
10883                let memory_index = MemoryIndex::from_u32(0);
10884                let effective_address = self.resolve_memory_ptr(
10885                    memory_index,
10886                    memarg,
10887                    self.intrinsics.ptr_ty,
10888                    offset,
10889                    4,
10890                )?;
10891                self.trap_if_misaligned(memarg, effective_address, 4)?;
10892                let old = self
10893                    .builder
10894                    .build_atomicrmw(
10895                        AtomicRMWBinOp::Add,
10896                        effective_address,
10897                        value,
10898                        AtomicOrdering::SequentiallyConsistent,
10899                    )
10900                    .unwrap();
10901                tbaa_label(
10902                    self.module,
10903                    self.intrinsics,
10904                    format!("memory {}", memory_index.as_u32()),
10905                    old.as_instruction_value().unwrap(),
10906                );
10907                self.state.push1(old);
10908            }
10909            Operator::I64AtomicRmw8AddU { ref memarg } => {
10910                let value = self.state.pop1()?.into_int_value();
10911                let offset = self.state.pop1()?.into_int_value();
10912                let memory_index = MemoryIndex::from_u32(0);
10913                let effective_address = self.resolve_memory_ptr(
10914                    memory_index,
10915                    memarg,
10916                    self.intrinsics.ptr_ty,
10917                    offset,
10918                    1,
10919                )?;
10920                self.trap_if_misaligned(memarg, effective_address, 1)?;
10921                let narrow_value = err!(self.builder.build_int_truncate(
10922                    value,
10923                    self.intrinsics.i8_ty,
10924                    ""
10925                ));
10926                let old = self
10927                    .builder
10928                    .build_atomicrmw(
10929                        AtomicRMWBinOp::Add,
10930                        effective_address,
10931                        narrow_value,
10932                        AtomicOrdering::SequentiallyConsistent,
10933                    )
10934                    .unwrap();
10935                self.annotate_user_memaccess(
10936                    memory_index,
10937                    memarg,
10938                    0,
10939                    old.as_instruction_value().unwrap(),
10940                )?;
10941                let old = err!(
10942                    self.builder
10943                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
10944                );
10945                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
10946            }
10947            Operator::I64AtomicRmw16AddU { ref memarg } => {
10948                let value = self.state.pop1()?.into_int_value();
10949                let offset = self.state.pop1()?.into_int_value();
10950                let memory_index = MemoryIndex::from_u32(0);
10951                let effective_address = self.resolve_memory_ptr(
10952                    memory_index,
10953                    memarg,
10954                    self.intrinsics.ptr_ty,
10955                    offset,
10956                    2,
10957                )?;
10958                self.trap_if_misaligned(memarg, effective_address, 2)?;
10959                let narrow_value = err!(self.builder.build_int_truncate(
10960                    value,
10961                    self.intrinsics.i16_ty,
10962                    ""
10963                ));
10964                let old = self
10965                    .builder
10966                    .build_atomicrmw(
10967                        AtomicRMWBinOp::Add,
10968                        effective_address,
10969                        narrow_value,
10970                        AtomicOrdering::SequentiallyConsistent,
10971                    )
10972                    .unwrap();
10973                self.annotate_user_memaccess(
10974                    memory_index,
10975                    memarg,
10976                    0,
10977                    old.as_instruction_value().unwrap(),
10978                )?;
10979                let old = err!(
10980                    self.builder
10981                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
10982                );
10983                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
10984            }
10985            Operator::I64AtomicRmw32AddU { ref memarg } => {
10986                let value = self.state.pop1()?.into_int_value();
10987                let offset = self.state.pop1()?.into_int_value();
10988                let memory_index = MemoryIndex::from_u32(0);
10989                let effective_address = self.resolve_memory_ptr(
10990                    memory_index,
10991                    memarg,
10992                    self.intrinsics.ptr_ty,
10993                    offset,
10994                    4,
10995                )?;
10996                self.trap_if_misaligned(memarg, effective_address, 4)?;
10997                let narrow_value = err!(self.builder.build_int_truncate(
10998                    value,
10999                    self.intrinsics.i32_ty,
11000                    ""
11001                ));
11002                let old = self
11003                    .builder
11004                    .build_atomicrmw(
11005                        AtomicRMWBinOp::Add,
11006                        effective_address,
11007                        narrow_value,
11008                        AtomicOrdering::SequentiallyConsistent,
11009                    )
11010                    .unwrap();
11011                self.annotate_user_memaccess(
11012                    memory_index,
11013                    memarg,
11014                    0,
11015                    old.as_instruction_value().unwrap(),
11016                )?;
11017                let old = err!(
11018                    self.builder
11019                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11020                );
11021                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11022            }
11023            Operator::I64AtomicRmwAdd { ref memarg } => {
11024                let value = self.state.pop1()?.into_int_value();
11025                let offset = self.state.pop1()?.into_int_value();
11026                let memory_index = MemoryIndex::from_u32(0);
11027                let effective_address = self.resolve_memory_ptr(
11028                    memory_index,
11029                    memarg,
11030                    self.intrinsics.ptr_ty,
11031                    offset,
11032                    8,
11033                )?;
11034                self.trap_if_misaligned(memarg, effective_address, 8)?;
11035                let old = self
11036                    .builder
11037                    .build_atomicrmw(
11038                        AtomicRMWBinOp::Add,
11039                        effective_address,
11040                        value,
11041                        AtomicOrdering::SequentiallyConsistent,
11042                    )
11043                    .unwrap();
11044                self.annotate_user_memaccess(
11045                    memory_index,
11046                    memarg,
11047                    0,
11048                    old.as_instruction_value().unwrap(),
11049                )?;
11050                self.state.push1(old);
11051            }
11052            Operator::I32AtomicRmw8SubU { ref memarg } => {
11053                let value = self.state.pop1()?.into_int_value();
11054                let offset = self.state.pop1()?.into_int_value();
11055                let memory_index = MemoryIndex::from_u32(0);
11056                let effective_address = self.resolve_memory_ptr(
11057                    memory_index,
11058                    memarg,
11059                    self.intrinsics.ptr_ty,
11060                    offset,
11061                    1,
11062                )?;
11063                self.trap_if_misaligned(memarg, effective_address, 1)?;
11064                let narrow_value = err!(self.builder.build_int_truncate(
11065                    value,
11066                    self.intrinsics.i8_ty,
11067                    ""
11068                ));
11069                let old = self
11070                    .builder
11071                    .build_atomicrmw(
11072                        AtomicRMWBinOp::Sub,
11073                        effective_address,
11074                        narrow_value,
11075                        AtomicOrdering::SequentiallyConsistent,
11076                    )
11077                    .unwrap();
11078                self.annotate_user_memaccess(
11079                    memory_index,
11080                    memarg,
11081                    0,
11082                    old.as_instruction_value().unwrap(),
11083                )?;
11084                let old = err!(
11085                    self.builder
11086                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11087                );
11088                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11089            }
11090            Operator::I32AtomicRmw16SubU { ref memarg } => {
11091                let value = self.state.pop1()?.into_int_value();
11092                let offset = self.state.pop1()?.into_int_value();
11093                let memory_index = MemoryIndex::from_u32(0);
11094                let effective_address = self.resolve_memory_ptr(
11095                    memory_index,
11096                    memarg,
11097                    self.intrinsics.ptr_ty,
11098                    offset,
11099                    2,
11100                )?;
11101                self.trap_if_misaligned(memarg, effective_address, 2)?;
11102                let narrow_value = err!(self.builder.build_int_truncate(
11103                    value,
11104                    self.intrinsics.i16_ty,
11105                    ""
11106                ));
11107                let old = self
11108                    .builder
11109                    .build_atomicrmw(
11110                        AtomicRMWBinOp::Sub,
11111                        effective_address,
11112                        narrow_value,
11113                        AtomicOrdering::SequentiallyConsistent,
11114                    )
11115                    .unwrap();
11116                self.annotate_user_memaccess(
11117                    memory_index,
11118                    memarg,
11119                    0,
11120                    old.as_instruction_value().unwrap(),
11121                )?;
11122                let old = err!(
11123                    self.builder
11124                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11125                );
11126                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11127            }
11128            Operator::I32AtomicRmwSub { ref memarg } => {
11129                let value = self.state.pop1()?.into_int_value();
11130                let offset = self.state.pop1()?.into_int_value();
11131                let memory_index = MemoryIndex::from_u32(0);
11132                let effective_address = self.resolve_memory_ptr(
11133                    memory_index,
11134                    memarg,
11135                    self.intrinsics.ptr_ty,
11136                    offset,
11137                    4,
11138                )?;
11139                self.trap_if_misaligned(memarg, effective_address, 4)?;
11140                let old = self
11141                    .builder
11142                    .build_atomicrmw(
11143                        AtomicRMWBinOp::Sub,
11144                        effective_address,
11145                        value,
11146                        AtomicOrdering::SequentiallyConsistent,
11147                    )
11148                    .unwrap();
11149                self.annotate_user_memaccess(
11150                    memory_index,
11151                    memarg,
11152                    0,
11153                    old.as_instruction_value().unwrap(),
11154                )?;
11155                self.state.push1(old);
11156            }
11157            Operator::I64AtomicRmw8SubU { ref memarg } => {
11158                let value = self.state.pop1()?.into_int_value();
11159                let offset = self.state.pop1()?.into_int_value();
11160                let memory_index = MemoryIndex::from_u32(0);
11161                let effective_address = self.resolve_memory_ptr(
11162                    memory_index,
11163                    memarg,
11164                    self.intrinsics.ptr_ty,
11165                    offset,
11166                    1,
11167                )?;
11168                self.trap_if_misaligned(memarg, effective_address, 1)?;
11169                let narrow_value = err!(self.builder.build_int_truncate(
11170                    value,
11171                    self.intrinsics.i8_ty,
11172                    ""
11173                ));
11174                let old = self
11175                    .builder
11176                    .build_atomicrmw(
11177                        AtomicRMWBinOp::Sub,
11178                        effective_address,
11179                        narrow_value,
11180                        AtomicOrdering::SequentiallyConsistent,
11181                    )
11182                    .unwrap();
11183                self.annotate_user_memaccess(
11184                    memory_index,
11185                    memarg,
11186                    0,
11187                    old.as_instruction_value().unwrap(),
11188                )?;
11189                let old = err!(
11190                    self.builder
11191                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11192                );
11193                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11194            }
11195            Operator::I64AtomicRmw16SubU { ref memarg } => {
11196                let value = self.state.pop1()?.into_int_value();
11197                let offset = self.state.pop1()?.into_int_value();
11198                let memory_index = MemoryIndex::from_u32(0);
11199                let effective_address = self.resolve_memory_ptr(
11200                    memory_index,
11201                    memarg,
11202                    self.intrinsics.ptr_ty,
11203                    offset,
11204                    2,
11205                )?;
11206                self.trap_if_misaligned(memarg, effective_address, 2)?;
11207                let narrow_value = err!(self.builder.build_int_truncate(
11208                    value,
11209                    self.intrinsics.i16_ty,
11210                    ""
11211                ));
11212                let old = self
11213                    .builder
11214                    .build_atomicrmw(
11215                        AtomicRMWBinOp::Sub,
11216                        effective_address,
11217                        narrow_value,
11218                        AtomicOrdering::SequentiallyConsistent,
11219                    )
11220                    .unwrap();
11221                self.annotate_user_memaccess(
11222                    memory_index,
11223                    memarg,
11224                    0,
11225                    old.as_instruction_value().unwrap(),
11226                )?;
11227                let old = err!(
11228                    self.builder
11229                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11230                );
11231                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11232            }
11233            Operator::I64AtomicRmw32SubU { ref memarg } => {
11234                let value = self.state.pop1()?.into_int_value();
11235                let offset = self.state.pop1()?.into_int_value();
11236                let memory_index = MemoryIndex::from_u32(0);
11237                let effective_address = self.resolve_memory_ptr(
11238                    memory_index,
11239                    memarg,
11240                    self.intrinsics.ptr_ty,
11241                    offset,
11242                    4,
11243                )?;
11244                self.trap_if_misaligned(memarg, effective_address, 4)?;
11245                let narrow_value = err!(self.builder.build_int_truncate(
11246                    value,
11247                    self.intrinsics.i32_ty,
11248                    ""
11249                ));
11250                let old = self
11251                    .builder
11252                    .build_atomicrmw(
11253                        AtomicRMWBinOp::Sub,
11254                        effective_address,
11255                        narrow_value,
11256                        AtomicOrdering::SequentiallyConsistent,
11257                    )
11258                    .unwrap();
11259                self.annotate_user_memaccess(
11260                    memory_index,
11261                    memarg,
11262                    0,
11263                    old.as_instruction_value().unwrap(),
11264                )?;
11265                let old = err!(
11266                    self.builder
11267                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11268                );
11269                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11270            }
11271            Operator::I64AtomicRmwSub { ref memarg } => {
11272                let value = self.state.pop1()?.into_int_value();
11273                let offset = self.state.pop1()?.into_int_value();
11274                let memory_index = MemoryIndex::from_u32(0);
11275                let effective_address = self.resolve_memory_ptr(
11276                    memory_index,
11277                    memarg,
11278                    self.intrinsics.ptr_ty,
11279                    offset,
11280                    8,
11281                )?;
11282                self.trap_if_misaligned(memarg, effective_address, 8)?;
11283                let old = self
11284                    .builder
11285                    .build_atomicrmw(
11286                        AtomicRMWBinOp::Sub,
11287                        effective_address,
11288                        value,
11289                        AtomicOrdering::SequentiallyConsistent,
11290                    )
11291                    .unwrap();
11292                self.annotate_user_memaccess(
11293                    memory_index,
11294                    memarg,
11295                    0,
11296                    old.as_instruction_value().unwrap(),
11297                )?;
11298                self.state.push1(old);
11299            }
11300            Operator::I32AtomicRmw8AndU { ref memarg } => {
11301                let value = self.state.pop1()?.into_int_value();
11302                let offset = self.state.pop1()?.into_int_value();
11303                let memory_index = MemoryIndex::from_u32(0);
11304                let effective_address = self.resolve_memory_ptr(
11305                    memory_index,
11306                    memarg,
11307                    self.intrinsics.ptr_ty,
11308                    offset,
11309                    1,
11310                )?;
11311                self.trap_if_misaligned(memarg, effective_address, 1)?;
11312                let narrow_value = err!(self.builder.build_int_truncate(
11313                    value,
11314                    self.intrinsics.i8_ty,
11315                    ""
11316                ));
11317                let old = self
11318                    .builder
11319                    .build_atomicrmw(
11320                        AtomicRMWBinOp::And,
11321                        effective_address,
11322                        narrow_value,
11323                        AtomicOrdering::SequentiallyConsistent,
11324                    )
11325                    .unwrap();
11326                self.annotate_user_memaccess(
11327                    memory_index,
11328                    memarg,
11329                    0,
11330                    old.as_instruction_value().unwrap(),
11331                )?;
11332                let old = err!(
11333                    self.builder
11334                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11335                );
11336                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11337            }
11338            Operator::I32AtomicRmw16AndU { ref memarg } => {
11339                let value = self.state.pop1()?.into_int_value();
11340                let offset = self.state.pop1()?.into_int_value();
11341                let memory_index = MemoryIndex::from_u32(0);
11342                let effective_address = self.resolve_memory_ptr(
11343                    memory_index,
11344                    memarg,
11345                    self.intrinsics.ptr_ty,
11346                    offset,
11347                    2,
11348                )?;
11349                self.trap_if_misaligned(memarg, effective_address, 2)?;
11350                let narrow_value = err!(self.builder.build_int_truncate(
11351                    value,
11352                    self.intrinsics.i16_ty,
11353                    ""
11354                ));
11355                let old = self
11356                    .builder
11357                    .build_atomicrmw(
11358                        AtomicRMWBinOp::And,
11359                        effective_address,
11360                        narrow_value,
11361                        AtomicOrdering::SequentiallyConsistent,
11362                    )
11363                    .unwrap();
11364                self.annotate_user_memaccess(
11365                    memory_index,
11366                    memarg,
11367                    0,
11368                    old.as_instruction_value().unwrap(),
11369                )?;
11370                let old = err!(
11371                    self.builder
11372                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11373                );
11374                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11375            }
11376            Operator::I32AtomicRmwAnd { ref memarg } => {
11377                let value = self.state.pop1()?.into_int_value();
11378                let offset = self.state.pop1()?.into_int_value();
11379                let memory_index = MemoryIndex::from_u32(0);
11380                let effective_address = self.resolve_memory_ptr(
11381                    memory_index,
11382                    memarg,
11383                    self.intrinsics.ptr_ty,
11384                    offset,
11385                    4,
11386                )?;
11387                self.trap_if_misaligned(memarg, effective_address, 4)?;
11388                let old = self
11389                    .builder
11390                    .build_atomicrmw(
11391                        AtomicRMWBinOp::And,
11392                        effective_address,
11393                        value,
11394                        AtomicOrdering::SequentiallyConsistent,
11395                    )
11396                    .unwrap();
11397                self.annotate_user_memaccess(
11398                    memory_index,
11399                    memarg,
11400                    0,
11401                    old.as_instruction_value().unwrap(),
11402                )?;
11403                self.state.push1(old);
11404            }
11405            Operator::I64AtomicRmw8AndU { ref memarg } => {
11406                let value = self.state.pop1()?.into_int_value();
11407                let offset = self.state.pop1()?.into_int_value();
11408                let memory_index = MemoryIndex::from_u32(0);
11409                let effective_address = self.resolve_memory_ptr(
11410                    memory_index,
11411                    memarg,
11412                    self.intrinsics.ptr_ty,
11413                    offset,
11414                    1,
11415                )?;
11416                self.trap_if_misaligned(memarg, effective_address, 1)?;
11417                let narrow_value = err!(self.builder.build_int_truncate(
11418                    value,
11419                    self.intrinsics.i8_ty,
11420                    ""
11421                ));
11422                let old = self
11423                    .builder
11424                    .build_atomicrmw(
11425                        AtomicRMWBinOp::And,
11426                        effective_address,
11427                        narrow_value,
11428                        AtomicOrdering::SequentiallyConsistent,
11429                    )
11430                    .unwrap();
11431                self.annotate_user_memaccess(
11432                    memory_index,
11433                    memarg,
11434                    0,
11435                    old.as_instruction_value().unwrap(),
11436                )?;
11437                let old = err!(
11438                    self.builder
11439                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11440                );
11441                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11442            }
11443            Operator::I64AtomicRmw16AndU { ref memarg } => {
11444                let value = self.state.pop1()?.into_int_value();
11445                let offset = self.state.pop1()?.into_int_value();
11446                let memory_index = MemoryIndex::from_u32(0);
11447                let effective_address = self.resolve_memory_ptr(
11448                    memory_index,
11449                    memarg,
11450                    self.intrinsics.ptr_ty,
11451                    offset,
11452                    2,
11453                )?;
11454                self.trap_if_misaligned(memarg, effective_address, 2)?;
11455                let narrow_value = err!(self.builder.build_int_truncate(
11456                    value,
11457                    self.intrinsics.i16_ty,
11458                    ""
11459                ));
11460                let old = self
11461                    .builder
11462                    .build_atomicrmw(
11463                        AtomicRMWBinOp::And,
11464                        effective_address,
11465                        narrow_value,
11466                        AtomicOrdering::SequentiallyConsistent,
11467                    )
11468                    .unwrap();
11469                self.annotate_user_memaccess(
11470                    memory_index,
11471                    memarg,
11472                    0,
11473                    old.as_instruction_value().unwrap(),
11474                )?;
11475                let old = err!(
11476                    self.builder
11477                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11478                );
11479                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11480            }
11481            Operator::I64AtomicRmw32AndU { ref memarg } => {
11482                let value = self.state.pop1()?.into_int_value();
11483                let offset = self.state.pop1()?.into_int_value();
11484                let memory_index = MemoryIndex::from_u32(0);
11485                let effective_address = self.resolve_memory_ptr(
11486                    memory_index,
11487                    memarg,
11488                    self.intrinsics.ptr_ty,
11489                    offset,
11490                    4,
11491                )?;
11492                self.trap_if_misaligned(memarg, effective_address, 4)?;
11493                let narrow_value = err!(self.builder.build_int_truncate(
11494                    value,
11495                    self.intrinsics.i32_ty,
11496                    ""
11497                ));
11498                let old = self
11499                    .builder
11500                    .build_atomicrmw(
11501                        AtomicRMWBinOp::And,
11502                        effective_address,
11503                        narrow_value,
11504                        AtomicOrdering::SequentiallyConsistent,
11505                    )
11506                    .unwrap();
11507                self.annotate_user_memaccess(
11508                    memory_index,
11509                    memarg,
11510                    0,
11511                    old.as_instruction_value().unwrap(),
11512                )?;
11513                let old = err!(
11514                    self.builder
11515                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11516                );
11517                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11518            }
11519            Operator::I64AtomicRmwAnd { ref memarg } => {
11520                let value = self.state.pop1()?.into_int_value();
11521                let offset = self.state.pop1()?.into_int_value();
11522                let memory_index = MemoryIndex::from_u32(0);
11523                let effective_address = self.resolve_memory_ptr(
11524                    memory_index,
11525                    memarg,
11526                    self.intrinsics.ptr_ty,
11527                    offset,
11528                    8,
11529                )?;
11530                self.trap_if_misaligned(memarg, effective_address, 8)?;
11531                let old = self
11532                    .builder
11533                    .build_atomicrmw(
11534                        AtomicRMWBinOp::And,
11535                        effective_address,
11536                        value,
11537                        AtomicOrdering::SequentiallyConsistent,
11538                    )
11539                    .unwrap();
11540                self.annotate_user_memaccess(
11541                    memory_index,
11542                    memarg,
11543                    0,
11544                    old.as_instruction_value().unwrap(),
11545                )?;
11546                self.state.push1(old);
11547            }
11548            Operator::I32AtomicRmw8OrU { ref memarg } => {
11549                let value = self.state.pop1()?.into_int_value();
11550                let offset = self.state.pop1()?.into_int_value();
11551                let memory_index = MemoryIndex::from_u32(0);
11552                let effective_address = self.resolve_memory_ptr(
11553                    memory_index,
11554                    memarg,
11555                    self.intrinsics.ptr_ty,
11556                    offset,
11557                    1,
11558                )?;
11559                self.trap_if_misaligned(memarg, effective_address, 1)?;
11560                let narrow_value = err!(self.builder.build_int_truncate(
11561                    value,
11562                    self.intrinsics.i8_ty,
11563                    ""
11564                ));
11565                let old = self
11566                    .builder
11567                    .build_atomicrmw(
11568                        AtomicRMWBinOp::Or,
11569                        effective_address,
11570                        narrow_value,
11571                        AtomicOrdering::SequentiallyConsistent,
11572                    )
11573                    .unwrap();
11574                self.annotate_user_memaccess(
11575                    memory_index,
11576                    memarg,
11577                    0,
11578                    old.as_instruction_value().unwrap(),
11579                )?;
11580                let old = err!(
11581                    self.builder
11582                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11583                );
11584                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11585            }
11586            Operator::I32AtomicRmw16OrU { ref memarg } => {
11587                let value = self.state.pop1()?.into_int_value();
11588                let offset = self.state.pop1()?.into_int_value();
11589                let memory_index = MemoryIndex::from_u32(0);
11590                let effective_address = self.resolve_memory_ptr(
11591                    memory_index,
11592                    memarg,
11593                    self.intrinsics.ptr_ty,
11594                    offset,
11595                    2,
11596                )?;
11597                self.trap_if_misaligned(memarg, effective_address, 2)?;
11598                let narrow_value = err!(self.builder.build_int_truncate(
11599                    value,
11600                    self.intrinsics.i16_ty,
11601                    ""
11602                ));
11603                let old = self
11604                    .builder
11605                    .build_atomicrmw(
11606                        AtomicRMWBinOp::Or,
11607                        effective_address,
11608                        narrow_value,
11609                        AtomicOrdering::SequentiallyConsistent,
11610                    )
11611                    .unwrap();
11612                self.annotate_user_memaccess(
11613                    memory_index,
11614                    memarg,
11615                    0,
11616                    old.as_instruction_value().unwrap(),
11617                )?;
11618                let old = err!(
11619                    self.builder
11620                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11621                );
11622                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11623            }
11624            Operator::I32AtomicRmwOr { ref memarg } => {
11625                let value = self.state.pop1()?.into_int_value();
11626                let offset = self.state.pop1()?.into_int_value();
11627                let memory_index = MemoryIndex::from_u32(0);
11628                let effective_address = self.resolve_memory_ptr(
11629                    memory_index,
11630                    memarg,
11631                    self.intrinsics.ptr_ty,
11632                    offset,
11633                    4,
11634                )?;
11635                self.trap_if_misaligned(memarg, effective_address, 4)?;
11636                let old = self
11637                    .builder
11638                    .build_atomicrmw(
11639                        AtomicRMWBinOp::Or,
11640                        effective_address,
11641                        value,
11642                        AtomicOrdering::SequentiallyConsistent,
11643                    )
11644                    .unwrap();
11645                self.annotate_user_memaccess(
11646                    memory_index,
11647                    memarg,
11648                    0,
11649                    old.as_instruction_value().unwrap(),
11650                )?;
11651                let old = err!(
11652                    self.builder
11653                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11654                );
11655                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11656            }
11657            Operator::I64AtomicRmw8OrU { ref memarg } => {
11658                let value = self.state.pop1()?.into_int_value();
11659                let offset = self.state.pop1()?.into_int_value();
11660                let memory_index = MemoryIndex::from_u32(0);
11661                let effective_address = self.resolve_memory_ptr(
11662                    memory_index,
11663                    memarg,
11664                    self.intrinsics.ptr_ty,
11665                    offset,
11666                    1,
11667                )?;
11668                self.trap_if_misaligned(memarg, effective_address, 1)?;
11669                let narrow_value = err!(self.builder.build_int_truncate(
11670                    value,
11671                    self.intrinsics.i8_ty,
11672                    ""
11673                ));
11674                let old = self
11675                    .builder
11676                    .build_atomicrmw(
11677                        AtomicRMWBinOp::Or,
11678                        effective_address,
11679                        narrow_value,
11680                        AtomicOrdering::SequentiallyConsistent,
11681                    )
11682                    .unwrap();
11683                self.annotate_user_memaccess(
11684                    memory_index,
11685                    memarg,
11686                    0,
11687                    old.as_instruction_value().unwrap(),
11688                )?;
11689                let old = err!(
11690                    self.builder
11691                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11692                );
11693                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11694            }
11695            Operator::I64AtomicRmw16OrU { ref memarg } => {
11696                let value = self.state.pop1()?.into_int_value();
11697                let offset = self.state.pop1()?.into_int_value();
11698                let memory_index = MemoryIndex::from_u32(0);
11699                let effective_address = self.resolve_memory_ptr(
11700                    memory_index,
11701                    memarg,
11702                    self.intrinsics.ptr_ty,
11703                    offset,
11704                    2,
11705                )?;
11706                self.trap_if_misaligned(memarg, effective_address, 2)?;
11707                let narrow_value = err!(self.builder.build_int_truncate(
11708                    value,
11709                    self.intrinsics.i16_ty,
11710                    ""
11711                ));
11712                let old = self
11713                    .builder
11714                    .build_atomicrmw(
11715                        AtomicRMWBinOp::Or,
11716                        effective_address,
11717                        narrow_value,
11718                        AtomicOrdering::SequentiallyConsistent,
11719                    )
11720                    .unwrap();
11721                self.annotate_user_memaccess(
11722                    memory_index,
11723                    memarg,
11724                    0,
11725                    old.as_instruction_value().unwrap(),
11726                )?;
11727                let old = err!(
11728                    self.builder
11729                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11730                );
11731                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11732            }
11733            Operator::I64AtomicRmw32OrU { ref memarg } => {
11734                let value = self.state.pop1()?.into_int_value();
11735                let offset = self.state.pop1()?.into_int_value();
11736                let memory_index = MemoryIndex::from_u32(0);
11737                let effective_address = self.resolve_memory_ptr(
11738                    memory_index,
11739                    memarg,
11740                    self.intrinsics.ptr_ty,
11741                    offset,
11742                    4,
11743                )?;
11744                self.trap_if_misaligned(memarg, effective_address, 4)?;
11745                let narrow_value = err!(self.builder.build_int_truncate(
11746                    value,
11747                    self.intrinsics.i32_ty,
11748                    ""
11749                ));
11750                let old = self
11751                    .builder
11752                    .build_atomicrmw(
11753                        AtomicRMWBinOp::Or,
11754                        effective_address,
11755                        narrow_value,
11756                        AtomicOrdering::SequentiallyConsistent,
11757                    )
11758                    .unwrap();
11759                self.annotate_user_memaccess(
11760                    memory_index,
11761                    memarg,
11762                    0,
11763                    old.as_instruction_value().unwrap(),
11764                )?;
11765                let old = err!(
11766                    self.builder
11767                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11768                );
11769                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11770            }
11771            Operator::I64AtomicRmwOr { ref memarg } => {
11772                let value = self.state.pop1()?.into_int_value();
11773                let offset = self.state.pop1()?.into_int_value();
11774                let memory_index = MemoryIndex::from_u32(0);
11775                let effective_address = self.resolve_memory_ptr(
11776                    memory_index,
11777                    memarg,
11778                    self.intrinsics.ptr_ty,
11779                    offset,
11780                    8,
11781                )?;
11782                self.trap_if_misaligned(memarg, effective_address, 8)?;
11783                let old = self
11784                    .builder
11785                    .build_atomicrmw(
11786                        AtomicRMWBinOp::Or,
11787                        effective_address,
11788                        value,
11789                        AtomicOrdering::SequentiallyConsistent,
11790                    )
11791                    .unwrap();
11792                self.annotate_user_memaccess(
11793                    memory_index,
11794                    memarg,
11795                    0,
11796                    old.as_instruction_value().unwrap(),
11797                )?;
11798                self.state.push1(old);
11799            }
11800            Operator::I32AtomicRmw8XorU { ref memarg } => {
11801                let value = self.state.pop1()?.into_int_value();
11802                let offset = self.state.pop1()?.into_int_value();
11803                let memory_index = MemoryIndex::from_u32(0);
11804                let effective_address = self.resolve_memory_ptr(
11805                    memory_index,
11806                    memarg,
11807                    self.intrinsics.ptr_ty,
11808                    offset,
11809                    1,
11810                )?;
11811                self.trap_if_misaligned(memarg, effective_address, 2)?;
11812                let narrow_value = err!(self.builder.build_int_truncate(
11813                    value,
11814                    self.intrinsics.i8_ty,
11815                    ""
11816                ));
11817                let old = self
11818                    .builder
11819                    .build_atomicrmw(
11820                        AtomicRMWBinOp::Xor,
11821                        effective_address,
11822                        narrow_value,
11823                        AtomicOrdering::SequentiallyConsistent,
11824                    )
11825                    .unwrap();
11826                self.annotate_user_memaccess(
11827                    memory_index,
11828                    memarg,
11829                    0,
11830                    old.as_instruction_value().unwrap(),
11831                )?;
11832                let old = err!(
11833                    self.builder
11834                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11835                );
11836                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11837            }
11838            Operator::I32AtomicRmw16XorU { ref memarg } => {
11839                let value = self.state.pop1()?.into_int_value();
11840                let offset = self.state.pop1()?.into_int_value();
11841                let memory_index = MemoryIndex::from_u32(0);
11842                let effective_address = self.resolve_memory_ptr(
11843                    memory_index,
11844                    memarg,
11845                    self.intrinsics.ptr_ty,
11846                    offset,
11847                    2,
11848                )?;
11849                self.trap_if_misaligned(memarg, effective_address, 2)?;
11850                let narrow_value = err!(self.builder.build_int_truncate(
11851                    value,
11852                    self.intrinsics.i16_ty,
11853                    ""
11854                ));
11855                let old = self
11856                    .builder
11857                    .build_atomicrmw(
11858                        AtomicRMWBinOp::Xor,
11859                        effective_address,
11860                        narrow_value,
11861                        AtomicOrdering::SequentiallyConsistent,
11862                    )
11863                    .unwrap();
11864                self.annotate_user_memaccess(
11865                    memory_index,
11866                    memarg,
11867                    0,
11868                    old.as_instruction_value().unwrap(),
11869                )?;
11870                let old = err!(
11871                    self.builder
11872                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
11873                );
11874                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
11875            }
11876            Operator::I32AtomicRmwXor { ref memarg } => {
11877                let value = self.state.pop1()?.into_int_value();
11878                let offset = self.state.pop1()?.into_int_value();
11879                let memory_index = MemoryIndex::from_u32(0);
11880                let effective_address = self.resolve_memory_ptr(
11881                    memory_index,
11882                    memarg,
11883                    self.intrinsics.ptr_ty,
11884                    offset,
11885                    4,
11886                )?;
11887                self.trap_if_misaligned(memarg, effective_address, 4)?;
11888                let old = self
11889                    .builder
11890                    .build_atomicrmw(
11891                        AtomicRMWBinOp::Xor,
11892                        effective_address,
11893                        value,
11894                        AtomicOrdering::SequentiallyConsistent,
11895                    )
11896                    .unwrap();
11897                self.annotate_user_memaccess(
11898                    memory_index,
11899                    memarg,
11900                    0,
11901                    old.as_instruction_value().unwrap(),
11902                )?;
11903                self.state.push1(old);
11904            }
11905            Operator::I64AtomicRmw8XorU { ref memarg } => {
11906                let value = self.state.pop1()?.into_int_value();
11907                let offset = self.state.pop1()?.into_int_value();
11908                let memory_index = MemoryIndex::from_u32(0);
11909                let effective_address = self.resolve_memory_ptr(
11910                    memory_index,
11911                    memarg,
11912                    self.intrinsics.ptr_ty,
11913                    offset,
11914                    1,
11915                )?;
11916                self.trap_if_misaligned(memarg, effective_address, 1)?;
11917                let narrow_value = err!(self.builder.build_int_truncate(
11918                    value,
11919                    self.intrinsics.i8_ty,
11920                    ""
11921                ));
11922                let old = self
11923                    .builder
11924                    .build_atomicrmw(
11925                        AtomicRMWBinOp::Xor,
11926                        effective_address,
11927                        narrow_value,
11928                        AtomicOrdering::SequentiallyConsistent,
11929                    )
11930                    .unwrap();
11931                self.annotate_user_memaccess(
11932                    memory_index,
11933                    memarg,
11934                    0,
11935                    old.as_instruction_value().unwrap(),
11936                )?;
11937                let old = err!(
11938                    self.builder
11939                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11940                );
11941                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11942            }
11943            Operator::I64AtomicRmw16XorU { ref memarg } => {
11944                let value = self.state.pop1()?.into_int_value();
11945                let offset = self.state.pop1()?.into_int_value();
11946                let memory_index = MemoryIndex::from_u32(0);
11947                let effective_address = self.resolve_memory_ptr(
11948                    memory_index,
11949                    memarg,
11950                    self.intrinsics.ptr_ty,
11951                    offset,
11952                    2,
11953                )?;
11954                self.trap_if_misaligned(memarg, effective_address, 2)?;
11955                let narrow_value = err!(self.builder.build_int_truncate(
11956                    value,
11957                    self.intrinsics.i16_ty,
11958                    ""
11959                ));
11960                let old = self
11961                    .builder
11962                    .build_atomicrmw(
11963                        AtomicRMWBinOp::Xor,
11964                        effective_address,
11965                        narrow_value,
11966                        AtomicOrdering::SequentiallyConsistent,
11967                    )
11968                    .unwrap();
11969                self.annotate_user_memaccess(
11970                    memory_index,
11971                    memarg,
11972                    0,
11973                    old.as_instruction_value().unwrap(),
11974                )?;
11975                let old = err!(
11976                    self.builder
11977                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
11978                );
11979                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
11980            }
11981            Operator::I64AtomicRmw32XorU { ref memarg } => {
11982                let value = self.state.pop1()?.into_int_value();
11983                let offset = self.state.pop1()?.into_int_value();
11984                let memory_index = MemoryIndex::from_u32(0);
11985                let effective_address = self.resolve_memory_ptr(
11986                    memory_index,
11987                    memarg,
11988                    self.intrinsics.ptr_ty,
11989                    offset,
11990                    4,
11991                )?;
11992                self.trap_if_misaligned(memarg, effective_address, 4)?;
11993                let narrow_value = err!(self.builder.build_int_truncate(
11994                    value,
11995                    self.intrinsics.i32_ty,
11996                    ""
11997                ));
11998                let old = self
11999                    .builder
12000                    .build_atomicrmw(
12001                        AtomicRMWBinOp::Xor,
12002                        effective_address,
12003                        narrow_value,
12004                        AtomicOrdering::SequentiallyConsistent,
12005                    )
12006                    .unwrap();
12007                self.annotate_user_memaccess(
12008                    memory_index,
12009                    memarg,
12010                    0,
12011                    old.as_instruction_value().unwrap(),
12012                )?;
12013                let old = err!(
12014                    self.builder
12015                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
12016                );
12017                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
12018            }
12019            Operator::I64AtomicRmwXor { ref memarg } => {
12020                let value = self.state.pop1()?.into_int_value();
12021                let offset = self.state.pop1()?.into_int_value();
12022                let memory_index = MemoryIndex::from_u32(0);
12023                let effective_address = self.resolve_memory_ptr(
12024                    memory_index,
12025                    memarg,
12026                    self.intrinsics.ptr_ty,
12027                    offset,
12028                    8,
12029                )?;
12030                self.trap_if_misaligned(memarg, effective_address, 8)?;
12031                let old = self
12032                    .builder
12033                    .build_atomicrmw(
12034                        AtomicRMWBinOp::Xor,
12035                        effective_address,
12036                        value,
12037                        AtomicOrdering::SequentiallyConsistent,
12038                    )
12039                    .unwrap();
12040                self.annotate_user_memaccess(
12041                    memory_index,
12042                    memarg,
12043                    0,
12044                    old.as_instruction_value().unwrap(),
12045                )?;
12046                self.state.push1(old);
12047            }
12048            Operator::I32AtomicRmw8XchgU { ref memarg } => {
12049                let value = self.state.pop1()?.into_int_value();
12050                let offset = self.state.pop1()?.into_int_value();
12051                let memory_index = MemoryIndex::from_u32(0);
12052                let effective_address = self.resolve_memory_ptr(
12053                    memory_index,
12054                    memarg,
12055                    self.intrinsics.ptr_ty,
12056                    offset,
12057                    1,
12058                )?;
12059                self.trap_if_misaligned(memarg, effective_address, 1)?;
12060                let narrow_value = err!(self.builder.build_int_truncate(
12061                    value,
12062                    self.intrinsics.i8_ty,
12063                    ""
12064                ));
12065                let old = self
12066                    .builder
12067                    .build_atomicrmw(
12068                        AtomicRMWBinOp::Xchg,
12069                        effective_address,
12070                        narrow_value,
12071                        AtomicOrdering::SequentiallyConsistent,
12072                    )
12073                    .unwrap();
12074                self.annotate_user_memaccess(
12075                    memory_index,
12076                    memarg,
12077                    0,
12078                    old.as_instruction_value().unwrap(),
12079                )?;
12080                let old = err!(
12081                    self.builder
12082                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
12083                );
12084                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
12085            }
12086            Operator::I32AtomicRmw16XchgU { ref memarg } => {
12087                let value = self.state.pop1()?.into_int_value();
12088                let offset = self.state.pop1()?.into_int_value();
12089                let memory_index = MemoryIndex::from_u32(0);
12090                let effective_address = self.resolve_memory_ptr(
12091                    memory_index,
12092                    memarg,
12093                    self.intrinsics.ptr_ty,
12094                    offset,
12095                    2,
12096                )?;
12097                self.trap_if_misaligned(memarg, effective_address, 2)?;
12098                let narrow_value = err!(self.builder.build_int_truncate(
12099                    value,
12100                    self.intrinsics.i16_ty,
12101                    ""
12102                ));
12103                let old = self
12104                    .builder
12105                    .build_atomicrmw(
12106                        AtomicRMWBinOp::Xchg,
12107                        effective_address,
12108                        narrow_value,
12109                        AtomicOrdering::SequentiallyConsistent,
12110                    )
12111                    .unwrap();
12112                self.annotate_user_memaccess(
12113                    memory_index,
12114                    memarg,
12115                    0,
12116                    old.as_instruction_value().unwrap(),
12117                )?;
12118                let old = err!(
12119                    self.builder
12120                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
12121                );
12122                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
12123            }
12124            Operator::I32AtomicRmwXchg { ref memarg } => {
12125                let value = self.state.pop1()?.into_int_value();
12126                let offset = self.state.pop1()?.into_int_value();
12127                let memory_index = MemoryIndex::from_u32(0);
12128                let effective_address = self.resolve_memory_ptr(
12129                    memory_index,
12130                    memarg,
12131                    self.intrinsics.ptr_ty,
12132                    offset,
12133                    4,
12134                )?;
12135                self.trap_if_misaligned(memarg, effective_address, 4)?;
12136                let old = self
12137                    .builder
12138                    .build_atomicrmw(
12139                        AtomicRMWBinOp::Xchg,
12140                        effective_address,
12141                        value,
12142                        AtomicOrdering::SequentiallyConsistent,
12143                    )
12144                    .unwrap();
12145                self.annotate_user_memaccess(
12146                    memory_index,
12147                    memarg,
12148                    0,
12149                    old.as_instruction_value().unwrap(),
12150                )?;
12151                self.state.push1(old);
12152            }
12153            Operator::I64AtomicRmw8XchgU { ref memarg } => {
12154                let value = self.state.pop1()?.into_int_value();
12155                let offset = self.state.pop1()?.into_int_value();
12156                let memory_index = MemoryIndex::from_u32(0);
12157                let effective_address = self.resolve_memory_ptr(
12158                    memory_index,
12159                    memarg,
12160                    self.intrinsics.ptr_ty,
12161                    offset,
12162                    1,
12163                )?;
12164                self.trap_if_misaligned(memarg, effective_address, 1)?;
12165                let narrow_value = err!(self.builder.build_int_truncate(
12166                    value,
12167                    self.intrinsics.i8_ty,
12168                    ""
12169                ));
12170                let old = self
12171                    .builder
12172                    .build_atomicrmw(
12173                        AtomicRMWBinOp::Xchg,
12174                        effective_address,
12175                        narrow_value,
12176                        AtomicOrdering::SequentiallyConsistent,
12177                    )
12178                    .unwrap();
12179                self.annotate_user_memaccess(
12180                    memory_index,
12181                    memarg,
12182                    0,
12183                    old.as_instruction_value().unwrap(),
12184                )?;
12185                let old = err!(
12186                    self.builder
12187                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
12188                );
12189                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
12190            }
12191            Operator::I64AtomicRmw16XchgU { ref memarg } => {
12192                let value = self.state.pop1()?.into_int_value();
12193                let offset = self.state.pop1()?.into_int_value();
12194                let memory_index = MemoryIndex::from_u32(0);
12195                let effective_address = self.resolve_memory_ptr(
12196                    memory_index,
12197                    memarg,
12198                    self.intrinsics.ptr_ty,
12199                    offset,
12200                    2,
12201                )?;
12202                self.trap_if_misaligned(memarg, effective_address, 2)?;
12203                let narrow_value = err!(self.builder.build_int_truncate(
12204                    value,
12205                    self.intrinsics.i16_ty,
12206                    ""
12207                ));
12208                let old = self
12209                    .builder
12210                    .build_atomicrmw(
12211                        AtomicRMWBinOp::Xchg,
12212                        effective_address,
12213                        narrow_value,
12214                        AtomicOrdering::SequentiallyConsistent,
12215                    )
12216                    .unwrap();
12217                self.annotate_user_memaccess(
12218                    memory_index,
12219                    memarg,
12220                    0,
12221                    old.as_instruction_value().unwrap(),
12222                )?;
12223                let old = err!(
12224                    self.builder
12225                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
12226                );
12227                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
12228            }
12229            Operator::I64AtomicRmw32XchgU { ref memarg } => {
12230                let value = self.state.pop1()?.into_int_value();
12231                let offset = self.state.pop1()?.into_int_value();
12232                let memory_index = MemoryIndex::from_u32(0);
12233                let effective_address = self.resolve_memory_ptr(
12234                    memory_index,
12235                    memarg,
12236                    self.intrinsics.ptr_ty,
12237                    offset,
12238                    4,
12239                )?;
12240                self.trap_if_misaligned(memarg, effective_address, 4)?;
12241                let narrow_value = err!(self.builder.build_int_truncate(
12242                    value,
12243                    self.intrinsics.i32_ty,
12244                    ""
12245                ));
12246                let old = self
12247                    .builder
12248                    .build_atomicrmw(
12249                        AtomicRMWBinOp::Xchg,
12250                        effective_address,
12251                        narrow_value,
12252                        AtomicOrdering::SequentiallyConsistent,
12253                    )
12254                    .unwrap();
12255                self.annotate_user_memaccess(
12256                    memory_index,
12257                    memarg,
12258                    0,
12259                    old.as_instruction_value().unwrap(),
12260                )?;
12261                let old = err!(
12262                    self.builder
12263                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
12264                );
12265                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
12266            }
12267            Operator::I64AtomicRmwXchg { ref memarg } => {
12268                let value = self.state.pop1()?.into_int_value();
12269                let offset = self.state.pop1()?.into_int_value();
12270                let memory_index = MemoryIndex::from_u32(0);
12271                let effective_address = self.resolve_memory_ptr(
12272                    memory_index,
12273                    memarg,
12274                    self.intrinsics.ptr_ty,
12275                    offset,
12276                    8,
12277                )?;
12278                self.trap_if_misaligned(memarg, effective_address, 8)?;
12279                let old = self
12280                    .builder
12281                    .build_atomicrmw(
12282                        AtomicRMWBinOp::Xchg,
12283                        effective_address,
12284                        value,
12285                        AtomicOrdering::SequentiallyConsistent,
12286                    )
12287                    .unwrap();
12288                self.annotate_user_memaccess(
12289                    memory_index,
12290                    memarg,
12291                    0,
12292                    old.as_instruction_value().unwrap(),
12293                )?;
12294                self.state.push1(old);
12295            }
12296            Operator::I32AtomicRmw8CmpxchgU { ref memarg } => {
12297                let ((cmp, cmp_info), (new, new_info)) = self.state.pop2_extra()?;
12298                let cmp = self.apply_pending_canonicalization(cmp, cmp_info)?;
12299                let new = self.apply_pending_canonicalization(new, new_info)?;
12300                let (cmp, new) = (cmp.into_int_value(), new.into_int_value());
12301                let offset = self.state.pop1()?.into_int_value();
12302                let memory_index = MemoryIndex::from_u32(0);
12303                let effective_address = self.resolve_memory_ptr(
12304                    memory_index,
12305                    memarg,
12306                    self.intrinsics.ptr_ty,
12307                    offset,
12308                    1,
12309                )?;
12310                self.trap_if_misaligned(memarg, effective_address, 1)?;
12311                let narrow_cmp = err!(self.builder.build_int_truncate(
12312                    cmp,
12313                    self.intrinsics.i8_ty,
12314                    ""
12315                ));
12316                let narrow_new = err!(self.builder.build_int_truncate(
12317                    new,
12318                    self.intrinsics.i8_ty,
12319                    ""
12320                ));
12321                let old = self
12322                    .builder
12323                    .build_cmpxchg(
12324                        effective_address,
12325                        narrow_cmp,
12326                        narrow_new,
12327                        AtomicOrdering::SequentiallyConsistent,
12328                        AtomicOrdering::SequentiallyConsistent,
12329                    )
12330                    .unwrap();
12331                self.annotate_user_memaccess(
12332                    memory_index,
12333                    memarg,
12334                    0,
12335                    old.as_instruction_value().unwrap(),
12336                )?;
12337                let old = self
12338                    .builder
12339                    .build_extract_value(old, 0, "")
12340                    .unwrap()
12341                    .into_int_value();
12342                let old = err!(
12343                    self.builder
12344                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
12345                );
12346                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
12347            }
12348            Operator::I32AtomicRmw16CmpxchgU { ref memarg } => {
12349                let ((cmp, cmp_info), (new, new_info)) = self.state.pop2_extra()?;
12350                let cmp = self.apply_pending_canonicalization(cmp, cmp_info)?;
12351                let new = self.apply_pending_canonicalization(new, new_info)?;
12352                let (cmp, new) = (cmp.into_int_value(), new.into_int_value());
12353                let offset = self.state.pop1()?.into_int_value();
12354                let memory_index = MemoryIndex::from_u32(0);
12355                let effective_address = self.resolve_memory_ptr(
12356                    memory_index,
12357                    memarg,
12358                    self.intrinsics.ptr_ty,
12359                    offset,
12360                    2,
12361                )?;
12362                self.trap_if_misaligned(memarg, effective_address, 2)?;
12363                let narrow_cmp = err!(self.builder.build_int_truncate(
12364                    cmp,
12365                    self.intrinsics.i16_ty,
12366                    ""
12367                ));
12368                let narrow_new = err!(self.builder.build_int_truncate(
12369                    new,
12370                    self.intrinsics.i16_ty,
12371                    ""
12372                ));
12373                let old = self
12374                    .builder
12375                    .build_cmpxchg(
12376                        effective_address,
12377                        narrow_cmp,
12378                        narrow_new,
12379                        AtomicOrdering::SequentiallyConsistent,
12380                        AtomicOrdering::SequentiallyConsistent,
12381                    )
12382                    .unwrap();
12383                self.annotate_user_memaccess(
12384                    memory_index,
12385                    memarg,
12386                    0,
12387                    old.as_instruction_value().unwrap(),
12388                )?;
12389                let old = self
12390                    .builder
12391                    .build_extract_value(old, 0, "")
12392                    .unwrap()
12393                    .into_int_value();
12394                let old = err!(
12395                    self.builder
12396                        .build_int_z_extend(old, self.intrinsics.i32_ty, "")
12397                );
12398                self.state.push1_extra(old, ExtraInfo::arithmetic_f32());
12399            }
12400            Operator::I32AtomicRmwCmpxchg { ref memarg } => {
12401                let ((cmp, cmp_info), (new, new_info)) = self.state.pop2_extra()?;
12402                let cmp = self.apply_pending_canonicalization(cmp, cmp_info)?;
12403                let new = self.apply_pending_canonicalization(new, new_info)?;
12404                let (cmp, new) = (cmp.into_int_value(), new.into_int_value());
12405                let offset = self.state.pop1()?.into_int_value();
12406                let memory_index = MemoryIndex::from_u32(0);
12407                let effective_address = self.resolve_memory_ptr(
12408                    memory_index,
12409                    memarg,
12410                    self.intrinsics.ptr_ty,
12411                    offset,
12412                    4,
12413                )?;
12414                self.trap_if_misaligned(memarg, effective_address, 4)?;
12415                let old = self
12416                    .builder
12417                    .build_cmpxchg(
12418                        effective_address,
12419                        cmp,
12420                        new,
12421                        AtomicOrdering::SequentiallyConsistent,
12422                        AtomicOrdering::SequentiallyConsistent,
12423                    )
12424                    .unwrap();
12425                self.annotate_user_memaccess(
12426                    memory_index,
12427                    memarg,
12428                    0,
12429                    old.as_instruction_value().unwrap(),
12430                )?;
12431                let old = err!(self.builder.build_extract_value(old, 0, ""));
12432                self.state.push1(old);
12433            }
12434            Operator::I64AtomicRmw8CmpxchgU { ref memarg } => {
12435                let ((cmp, cmp_info), (new, new_info)) = self.state.pop2_extra()?;
12436                let cmp = self.apply_pending_canonicalization(cmp, cmp_info)?;
12437                let new = self.apply_pending_canonicalization(new, new_info)?;
12438                let (cmp, new) = (cmp.into_int_value(), new.into_int_value());
12439                let offset = self.state.pop1()?.into_int_value();
12440                let memory_index = MemoryIndex::from_u32(0);
12441                let effective_address = self.resolve_memory_ptr(
12442                    memory_index,
12443                    memarg,
12444                    self.intrinsics.ptr_ty,
12445                    offset,
12446                    1,
12447                )?;
12448                self.trap_if_misaligned(memarg, effective_address, 1)?;
12449                let narrow_cmp = err!(self.builder.build_int_truncate(
12450                    cmp,
12451                    self.intrinsics.i8_ty,
12452                    ""
12453                ));
12454                let narrow_new = err!(self.builder.build_int_truncate(
12455                    new,
12456                    self.intrinsics.i8_ty,
12457                    ""
12458                ));
12459                let old = self
12460                    .builder
12461                    .build_cmpxchg(
12462                        effective_address,
12463                        narrow_cmp,
12464                        narrow_new,
12465                        AtomicOrdering::SequentiallyConsistent,
12466                        AtomicOrdering::SequentiallyConsistent,
12467                    )
12468                    .unwrap();
12469                self.annotate_user_memaccess(
12470                    memory_index,
12471                    memarg,
12472                    0,
12473                    old.as_instruction_value().unwrap(),
12474                )?;
12475                let old = self
12476                    .builder
12477                    .build_extract_value(old, 0, "")
12478                    .unwrap()
12479                    .into_int_value();
12480                let old = err!(
12481                    self.builder
12482                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
12483                );
12484                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
12485            }
12486            Operator::I64AtomicRmw16CmpxchgU { ref memarg } => {
12487                let ((cmp, cmp_info), (new, new_info)) = self.state.pop2_extra()?;
12488                let cmp = self.apply_pending_canonicalization(cmp, cmp_info)?;
12489                let new = self.apply_pending_canonicalization(new, new_info)?;
12490                let (cmp, new) = (cmp.into_int_value(), new.into_int_value());
12491                let offset = self.state.pop1()?.into_int_value();
12492                let memory_index = MemoryIndex::from_u32(0);
12493                let effective_address = self.resolve_memory_ptr(
12494                    memory_index,
12495                    memarg,
12496                    self.intrinsics.ptr_ty,
12497                    offset,
12498                    2,
12499                )?;
12500                self.trap_if_misaligned(memarg, effective_address, 2)?;
12501                let narrow_cmp = err!(self.builder.build_int_truncate(
12502                    cmp,
12503                    self.intrinsics.i16_ty,
12504                    ""
12505                ));
12506                let narrow_new = err!(self.builder.build_int_truncate(
12507                    new,
12508                    self.intrinsics.i16_ty,
12509                    ""
12510                ));
12511                let old = self
12512                    .builder
12513                    .build_cmpxchg(
12514                        effective_address,
12515                        narrow_cmp,
12516                        narrow_new,
12517                        AtomicOrdering::SequentiallyConsistent,
12518                        AtomicOrdering::SequentiallyConsistent,
12519                    )
12520                    .unwrap();
12521                self.annotate_user_memaccess(
12522                    memory_index,
12523                    memarg,
12524                    0,
12525                    old.as_instruction_value().unwrap(),
12526                )?;
12527                let old = self
12528                    .builder
12529                    .build_extract_value(old, 0, "")
12530                    .unwrap()
12531                    .into_int_value();
12532                let old = err!(
12533                    self.builder
12534                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
12535                );
12536                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
12537            }
12538            Operator::I64AtomicRmw32CmpxchgU { ref memarg } => {
12539                let ((cmp, cmp_info), (new, new_info)) = self.state.pop2_extra()?;
12540                let cmp = self.apply_pending_canonicalization(cmp, cmp_info)?;
12541                let new = self.apply_pending_canonicalization(new, new_info)?;
12542                let (cmp, new) = (cmp.into_int_value(), new.into_int_value());
12543                let offset = self.state.pop1()?.into_int_value();
12544                let memory_index = MemoryIndex::from_u32(0);
12545                let effective_address = self.resolve_memory_ptr(
12546                    memory_index,
12547                    memarg,
12548                    self.intrinsics.ptr_ty,
12549                    offset,
12550                    4,
12551                )?;
12552                self.trap_if_misaligned(memarg, effective_address, 4)?;
12553                let narrow_cmp = err!(self.builder.build_int_truncate(
12554                    cmp,
12555                    self.intrinsics.i32_ty,
12556                    ""
12557                ));
12558                let narrow_new = err!(self.builder.build_int_truncate(
12559                    new,
12560                    self.intrinsics.i32_ty,
12561                    ""
12562                ));
12563                let old = self
12564                    .builder
12565                    .build_cmpxchg(
12566                        effective_address,
12567                        narrow_cmp,
12568                        narrow_new,
12569                        AtomicOrdering::SequentiallyConsistent,
12570                        AtomicOrdering::SequentiallyConsistent,
12571                    )
12572                    .unwrap();
12573                self.annotate_user_memaccess(
12574                    memory_index,
12575                    memarg,
12576                    0,
12577                    old.as_instruction_value().unwrap(),
12578                )?;
12579                let old = self
12580                    .builder
12581                    .build_extract_value(old, 0, "")
12582                    .unwrap()
12583                    .into_int_value();
12584                let old = err!(
12585                    self.builder
12586                        .build_int_z_extend(old, self.intrinsics.i64_ty, "")
12587                );
12588                self.state.push1_extra(old, ExtraInfo::arithmetic_f64());
12589            }
12590            Operator::I64AtomicRmwCmpxchg { ref memarg } => {
12591                let ((cmp, cmp_info), (new, new_info)) = self.state.pop2_extra()?;
12592                let cmp = self.apply_pending_canonicalization(cmp, cmp_info)?;
12593                let new = self.apply_pending_canonicalization(new, new_info)?;
12594                let (cmp, new) = (cmp.into_int_value(), new.into_int_value());
12595                let offset = self.state.pop1()?.into_int_value();
12596                let memory_index = MemoryIndex::from_u32(0);
12597                let effective_address = self.resolve_memory_ptr(
12598                    memory_index,
12599                    memarg,
12600                    self.intrinsics.ptr_ty,
12601                    offset,
12602                    8,
12603                )?;
12604                self.trap_if_misaligned(memarg, effective_address, 8)?;
12605                let old = self
12606                    .builder
12607                    .build_cmpxchg(
12608                        effective_address,
12609                        cmp,
12610                        new,
12611                        AtomicOrdering::SequentiallyConsistent,
12612                        AtomicOrdering::SequentiallyConsistent,
12613                    )
12614                    .unwrap();
12615                self.annotate_user_memaccess(
12616                    memory_index,
12617                    memarg,
12618                    0,
12619                    old.as_instruction_value().unwrap(),
12620                )?;
12621                let old = err!(self.builder.build_extract_value(old, 0, ""));
12622                self.state.push1(old);
12623            }
12624
12625            Operator::MemoryGrow { mem } => {
12626                let memory_index = MemoryIndex::from_u32(mem);
12627                let delta = self.state.pop1()?;
12628                let grow_fn_ptr = self.ctx.memory_grow(memory_index, self.intrinsics)?;
12629                let grow = err!(self.builder.build_indirect_call(
12630                    self.intrinsics.memory_grow_ty,
12631                    grow_fn_ptr,
12632                    &[
12633                        vmctx.as_basic_value_enum().into(),
12634                        delta.into(),
12635                        self.intrinsics.i32_ty.const_int(mem.into(), false).into(),
12636                    ],
12637                    "",
12638                ));
12639                self.state.push1(grow.try_as_basic_value().left().unwrap());
12640            }
12641            Operator::MemorySize { mem } => {
12642                let memory_index = MemoryIndex::from_u32(mem);
12643                let size_fn_ptr = self.ctx.memory_size(memory_index, self.intrinsics)?;
12644                let size = err!(self.builder.build_indirect_call(
12645                    self.intrinsics.memory_size_ty,
12646                    size_fn_ptr,
12647                    &[
12648                        vmctx.as_basic_value_enum().into(),
12649                        self.intrinsics.i32_ty.const_int(mem.into(), false).into(),
12650                    ],
12651                    "",
12652                ));
12653                self.state.push1(size.try_as_basic_value().left().unwrap());
12655            }
12656            Operator::MemoryInit { data_index, mem } => {
12657                let (dest, src, len) = self.state.pop3()?;
12658                let mem = self.intrinsics.i32_ty.const_int(mem.into(), false);
12659                let segment = self.intrinsics.i32_ty.const_int(data_index.into(), false);
12660                err!(self.builder.build_call(
12661                    self.intrinsics.memory_init,
12662                    &[
12663                        vmctx.as_basic_value_enum().into(),
12664                        mem.into(),
12665                        segment.into(),
12666                        dest.into(),
12667                        src.into(),
12668                        len.into(),
12669                    ],
12670                    "",
12671                ));
12672            }
12673            Operator::DataDrop { data_index } => {
12674                let segment = self.intrinsics.i32_ty.const_int(data_index.into(), false);
12675                err!(self.builder.build_call(
12676                    self.intrinsics.data_drop,
12677                    &[vmctx.as_basic_value_enum().into(), segment.into()],
12678                    "",
12679                ));
12680            }
12681            Operator::MemoryCopy { dst_mem, src_mem } => {
12682                let _dst = dst_mem;
12684                let (memory_copy, src) = if let Some(local_memory_index) = self
12685                    .wasm_module
12686                    .local_memory_index(MemoryIndex::from_u32(src_mem))
12687                {
12688                    (self.intrinsics.memory_copy, local_memory_index.as_u32())
12689                } else {
12690                    (self.intrinsics.imported_memory_copy, src_mem)
12691                };
12692
12693                let (dest_pos, src_pos, len) = self.state.pop3()?;
12694                let src_index = self.intrinsics.i32_ty.const_int(src.into(), false);
12695                err!(self.builder.build_call(
12696                    memory_copy,
12697                    &[
12698                        vmctx.as_basic_value_enum().into(),
12699                        src_index.into(),
12700                        dest_pos.into(),
12701                        src_pos.into(),
12702                        len.into(),
12703                    ],
12704                    "",
12705                ));
12706            }
12707            Operator::MemoryFill { mem } => {
12708                let (memory_fill, mem) = if let Some(local_memory_index) = self
12709                    .wasm_module
12710                    .local_memory_index(MemoryIndex::from_u32(mem))
12711                {
12712                    (self.intrinsics.memory_fill, local_memory_index.as_u32())
12713                } else {
12714                    (self.intrinsics.imported_memory_fill, mem)
12715                };
12716
12717                let (dst, val, len) = self.state.pop3()?;
12718                let mem_index = self.intrinsics.i32_ty.const_int(mem.into(), false);
12719                err!(self.builder.build_call(
12720                    memory_fill,
12721                    &[
12722                        vmctx.as_basic_value_enum().into(),
12723                        mem_index.into(),
12724                        dst.into(),
12725                        val.into(),
12726                        len.into(),
12727                    ],
12728                    "",
12729                ));
12730            }
12731            Operator::RefNull { hty } => {
12736                let ty = err!(wpheaptype_to_type(hty));
12737                let ty = type_to_llvm(self.intrinsics, ty)?;
12738                self.state.push1(ty.const_zero());
12739            }
12740            Operator::RefIsNull => {
12741                let value = self.state.pop1()?.into_pointer_value();
12742                let is_null = err!(self.builder.build_is_null(value, ""));
12743                let is_null = err!(self.builder.build_int_z_extend(
12744                    is_null,
12745                    self.intrinsics.i32_ty,
12746                    ""
12747                ));
12748                self.state.push1(is_null);
12749            }
12750            Operator::RefFunc { function_index } => {
12751                let index = self
12752                    .intrinsics
12753                    .i32_ty
12754                    .const_int(function_index.into(), false);
12755                let value = err!(self.builder.build_call(
12756                    self.intrinsics.func_ref,
12757                    &[self.ctx.basic().into(), index.into()],
12758                    "",
12759                ))
12760                .try_as_basic_value()
12761                .left()
12762                .unwrap();
12763                self.state.push1(value);
12764            }
12765            Operator::TableGet { table } => {
12766                let table_index = self.intrinsics.i32_ty.const_int(table.into(), false);
12767                let elem = self.state.pop1()?;
12768                let table_get = if self
12769                    .wasm_module
12770                    .local_table_index(TableIndex::from_u32(table))
12771                    .is_some()
12772                {
12773                    self.intrinsics.table_get
12774                } else {
12775                    self.intrinsics.imported_table_get
12776                };
12777                let value = err!(self.builder.build_call(
12778                    table_get,
12779                    &[self.ctx.basic().into(), table_index.into(), elem.into()],
12780                    "",
12781                ))
12782                .try_as_basic_value()
12783                .left()
12784                .unwrap();
12785                let value = err!(
12786                    self.builder.build_bit_cast(
12787                        value,
12788                        type_to_llvm(
12789                            self.intrinsics,
12790                            self.wasm_module
12791                                .tables
12792                                .get(TableIndex::from_u32(table))
12793                                .unwrap()
12794                                .ty,
12795                        )?,
12796                        "",
12797                    )
12798                );
12799                self.state.push1(value);
12800            }
12801            Operator::TableSet { table } => {
12802                let table_index = self.intrinsics.i32_ty.const_int(table.into(), false);
12803                let (elem, value) = self.state.pop2()?;
12804                let value = err!(
12805                    self.builder
12806                        .build_bit_cast(value, self.intrinsics.ptr_ty, "")
12807                );
12808                let table_set = if self
12809                    .wasm_module
12810                    .local_table_index(TableIndex::from_u32(table))
12811                    .is_some()
12812                {
12813                    self.intrinsics.table_set
12814                } else {
12815                    self.intrinsics.imported_table_set
12816                };
12817                err!(self.builder.build_call(
12818                    table_set,
12819                    &[
12820                        self.ctx.basic().into(),
12821                        table_index.into(),
12822                        elem.into(),
12823                        value.into(),
12824                    ],
12825                    "",
12826                ));
12827            }
12828            Operator::TableCopy {
12829                dst_table,
12830                src_table,
12831            } => {
12832                let (dst, src, len) = self.state.pop3()?;
12833                let dst_table = self.intrinsics.i32_ty.const_int(dst_table as u64, false);
12834                let src_table = self.intrinsics.i32_ty.const_int(src_table as u64, false);
12835                err!(self.builder.build_call(
12836                    self.intrinsics.table_copy,
12837                    &[
12838                        self.ctx.basic().into(),
12839                        dst_table.into(),
12840                        src_table.into(),
12841                        dst.into(),
12842                        src.into(),
12843                        len.into(),
12844                    ],
12845                    "",
12846                ));
12847            }
12848            Operator::TableInit { elem_index, table } => {
12849                let (dst, src, len) = self.state.pop3()?;
12850                let segment = self.intrinsics.i32_ty.const_int(elem_index as u64, false);
12851                let table = self.intrinsics.i32_ty.const_int(table as u64, false);
12852                err!(self.builder.build_call(
12853                    self.intrinsics.table_init,
12854                    &[
12855                        self.ctx.basic().into(),
12856                        table.into(),
12857                        segment.into(),
12858                        dst.into(),
12859                        src.into(),
12860                        len.into(),
12861                    ],
12862                    "",
12863                ));
12864            }
12865            Operator::ElemDrop { elem_index } => {
12866                let segment = self.intrinsics.i32_ty.const_int(elem_index as u64, false);
12867                err!(self.builder.build_call(
12868                    self.intrinsics.elem_drop,
12869                    &[self.ctx.basic().into(), segment.into()],
12870                    "",
12871                ));
12872            }
12873            Operator::TableFill { table } => {
12874                let table = self.intrinsics.i32_ty.const_int(table as u64, false);
12875                let (start, elem, len) = self.state.pop3()?;
12876                let elem = err!(
12877                    self.builder
12878                        .build_bit_cast(elem, self.intrinsics.ptr_ty, "")
12879                );
12880                err!(self.builder.build_call(
12881                    self.intrinsics.table_fill,
12882                    &[
12883                        self.ctx.basic().into(),
12884                        table.into(),
12885                        start.into(),
12886                        elem.into(),
12887                        len.into(),
12888                    ],
12889                    "",
12890                ));
12891            }
12892            Operator::TableGrow { table } => {
12893                let (elem, delta) = self.state.pop2()?;
12894                let elem = err!(
12895                    self.builder
12896                        .build_bit_cast(elem, self.intrinsics.ptr_ty, "")
12897                );
12898                let (table_grow, table_index) = if let Some(local_table_index) = self
12899                    .wasm_module
12900                    .local_table_index(TableIndex::from_u32(table))
12901                {
12902                    (self.intrinsics.table_grow, local_table_index.as_u32())
12903                } else {
12904                    (self.intrinsics.imported_table_grow, table)
12905                };
12906                let table_index = self.intrinsics.i32_ty.const_int(table_index as u64, false);
12907                let size = err!(self.builder.build_call(
12908                    table_grow,
12909                    &[
12910                        self.ctx.basic().into(),
12911                        elem.into(),
12912                        delta.into(),
12913                        table_index.into(),
12914                    ],
12915                    "",
12916                ))
12917                .try_as_basic_value()
12918                .left()
12919                .unwrap();
12920                self.state.push1(size);
12921            }
12922            Operator::TableSize { table } => {
12923                let (table_size, table_index) = if let Some(local_table_index) = self
12924                    .wasm_module
12925                    .local_table_index(TableIndex::from_u32(table))
12926                {
12927                    (self.intrinsics.table_size, local_table_index.as_u32())
12928                } else {
12929                    (self.intrinsics.imported_table_size, table)
12930                };
12931                let table_index = self.intrinsics.i32_ty.const_int(table_index as u64, false);
12932                let size = err!(self.builder.build_call(
12933                    table_size,
12934                    &[self.ctx.basic().into(), table_index.into()],
12935                    "",
12936                ))
12937                .try_as_basic_value()
12938                .left()
12939                .unwrap();
12940                self.state.push1(size);
12941            }
12942            Operator::MemoryAtomicWait32 { memarg } => {
12943                let memory_index = MemoryIndex::from_u32(memarg.memory);
12944                let (dst, val, timeout) = self.state.pop3()?;
12945                let wait32_fn_ptr = self.ctx.memory_wait32(memory_index, self.intrinsics)?;
12946                let ret = err!(
12947                    self.builder.build_indirect_call(
12948                        self.intrinsics.memory_wait32_ty,
12949                        wait32_fn_ptr,
12950                        &[
12951                            vmctx.as_basic_value_enum().into(),
12952                            self.intrinsics
12953                                .i32_ty
12954                                .const_int(memarg.memory as u64, false)
12955                                .into(),
12956                            dst.into(),
12957                            val.into(),
12958                            timeout.into(),
12959                        ],
12960                        "",
12961                    )
12962                );
12963                self.state.push1(ret.try_as_basic_value().left().unwrap());
12964            }
12965            Operator::MemoryAtomicWait64 { memarg } => {
12966                let memory_index = MemoryIndex::from_u32(memarg.memory);
12967                let (dst, val, timeout) = self.state.pop3()?;
12968                let wait64_fn_ptr = self.ctx.memory_wait64(memory_index, self.intrinsics)?;
12969                let ret = err!(
12970                    self.builder.build_indirect_call(
12971                        self.intrinsics.memory_wait64_ty,
12972                        wait64_fn_ptr,
12973                        &[
12974                            vmctx.as_basic_value_enum().into(),
12975                            self.intrinsics
12976                                .i32_ty
12977                                .const_int(memarg.memory as u64, false)
12978                                .into(),
12979                            dst.into(),
12980                            val.into(),
12981                            timeout.into(),
12982                        ],
12983                        "",
12984                    )
12985                );
12986                self.state.push1(ret.try_as_basic_value().left().unwrap());
12987            }
12988            Operator::MemoryAtomicNotify { memarg } => {
12989                let memory_index = MemoryIndex::from_u32(memarg.memory);
12990                let (dst, count) = self.state.pop2()?;
12991                let notify_fn_ptr = self.ctx.memory_notify(memory_index, self.intrinsics)?;
12992                let cnt = err!(
12993                    self.builder.build_indirect_call(
12994                        self.intrinsics.memory_notify_ty,
12995                        notify_fn_ptr,
12996                        &[
12997                            vmctx.as_basic_value_enum().into(),
12998                            self.intrinsics
12999                                .i32_ty
13000                                .const_int(memarg.memory as u64, false)
13001                                .into(),
13002                            dst.into(),
13003                            count.into(),
13004                        ],
13005                        "",
13006                    )
13007                );
13008                self.state.push1(cnt.try_as_basic_value().left().unwrap());
13009            }
13010
13011            Operator::TryTable { try_table } => {
13012                let current_block = self
13013                    .builder
13014                    .get_insert_block()
13015                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
13016
13017                self.builder.position_at_end(current_block);
13018
13019                let end_block = self.context.append_basic_block(self.function, "try_end");
13020
13021                let end_phis = {
13022                    self.builder.position_at_end(end_block);
13023
13024                    let phis = self
13025                        .module_translation
13026                        .blocktype_params_results(&try_table.ty)?
13027                        .1
13028                        .iter()
13029                        .map(|&wp_ty| {
13030                            err_nt!(wptype_to_type(wp_ty)).and_then(|wasm_ty| {
13031                                type_to_llvm(self.intrinsics, wasm_ty)
13032                                    .and_then(|ty| err_nt!(self.builder.build_phi(ty, "")))
13033                            })
13034                        })
13035                        .collect::<Result<_, _>>()?;
13036
13037                    self.builder.position_at_end(current_block);
13038                    phis
13039                };
13040
13041                let catches: Vec<_> = try_table
13045                    .catches
13046                    .into_iter()
13047                    .unique_by(|v| match v {
13048                        Catch::One { tag, .. } | Catch::OneRef { tag, .. } => *tag as i32,
13049                        Catch::All { .. } | Catch::AllRef { .. } => CATCH_ALL_TAG_VALUE,
13050                    })
13051                    .collect();
13052
13053                let null = self.intrinsics.ptr_ty.const_zero();
13055
13056                let mut catch_tag_values = vec![];
13057                let mut lpad_clauses: Vec<BasicValueEnum<'ctx>> = catches
13058                    .iter()
13059                    .map(|catch| match catch {
13060                        Catch::All { .. } | Catch::AllRef { .. } => {
13061                            catch_tag_values.push(CATCH_ALL_TAG_VALUE as u32);
13062                            Ok(null.into())
13063                        }
13064                        Catch::One { tag, .. } | Catch::OneRef { tag, .. } => {
13065                            catch_tag_values.push(*tag);
13066                            Ok(self.get_or_insert_tag_type_info_global(*tag as i32))
13067                        }
13068                    })
13069                    .collect::<Result<Vec<BasicValueEnum<'ctx>>, CompileError>>()?;
13070
13071                let mut outer_catch_blocks = vec![];
13075                for outer_landingpad in self.state.landingpads.iter().rev() {
13076                    for catch_info @ TagCatchInfo { tag, .. } in &outer_landingpad.tags {
13077                        if !catch_tag_values.contains(tag) {
13078                            catch_tag_values.push(*tag);
13079                            lpad_clauses.push(if *tag as i32 == CATCH_ALL_TAG_VALUE {
13080                                null.into()
13081                            } else {
13082                                *self.tags_cache.get(&(*tag as i32)).expect(
13083                                    "If a previous try_table encountered a tag, \
13084                                    it should be in the cache",
13085                                )
13086                            });
13087                            outer_catch_blocks.push(*catch_info);
13088                        }
13089                    }
13090                }
13091
13092                let mut maybe_lpad_block = None;
13096                let mut catch_blocks = vec![];
13097                if !lpad_clauses.is_empty() {
13098                    let lpad_block = self.context.append_basic_block(self.function, "catch");
13099                    let catch_all_block =
13100                        self.context.append_basic_block(self.function, "catch_all");
13101                    let catch_specific_block = self
13102                        .context
13103                        .append_basic_block(self.function, "catch_specific");
13104                    let catch_end_block =
13105                        self.context.append_basic_block(self.function, "catch_end");
13106                    let rethrow_block = self.context.append_basic_block(self.function, "rethrow");
13107
13108                    self.builder.position_at_end(lpad_block);
13109
13110                    let res = err!(self.builder.build_landing_pad(
13111                        self.intrinsics.lpad_exception_ty,
13112                        self.intrinsics.personality,
13113                        &lpad_clauses,
13114                        false,
13115                        "exc_struct",
13116                    ));
13117
13118                    let res = res.into_struct_value();
13119
13120                    let uw_exc = err!(self.builder.build_extract_value(res, 0, "exc_ptr"));
13121                    let pre_selector =
13122                        err!(self.builder.build_extract_value(res, 1, "pre_selector"));
13123
13124                    let pre_selector_is_zero = err!(self.builder.build_int_compare(
13127                        IntPredicate::EQ,
13128                        pre_selector.into_int_value(),
13129                        self.intrinsics.i32_zero,
13130                        "pre_selector_is_zero"
13131                    ));
13132                    err!(self.builder.build_conditional_branch(
13133                        pre_selector_is_zero,
13134                        catch_all_block,
13135                        catch_specific_block
13136                    ));
13137
13138                    self.builder.position_at_end(catch_all_block);
13139                    err!(self.builder.build_unconditional_branch(catch_end_block));
13140
13141                    self.builder.position_at_end(catch_specific_block);
13142                    let selector_value = err!(self.builder.build_call(
13143                        self.intrinsics.personality2,
13144                        &[self.ctx.basic().into(), uw_exc.into()],
13145                        "selector"
13146                    ));
13147                    err!(self.builder.build_unconditional_branch(catch_end_block));
13148
13149                    self.builder.position_at_end(catch_end_block);
13150                    let selector = err!(self.builder.build_phi(self.intrinsics.i32_ty, "selector"));
13151                    selector.add_incoming(&[
13152                        (
13153                            &self
13154                                .intrinsics
13155                                .i32_ty
13156                                .const_int(CATCH_ALL_TAG_VALUE as u64, false),
13157                            catch_all_block,
13158                        ),
13159                        (
13160                            &selector_value
13161                                .try_as_basic_value()
13162                                .left()
13163                                .unwrap()
13164                                .into_int_value(),
13165                            catch_specific_block,
13166                        ),
13167                    ]);
13168
13169                    let uw_exc = uw_exc.into_pointer_value();
13214                    let exnref = err!(self.builder.build_call(
13215                        self.intrinsics.exception_into_exnref,
13216                        &[uw_exc.into()],
13217                        "exnref"
13218                    ));
13219
13220                    let exnref = exnref.try_as_basic_value().left().unwrap().into_int_value();
13221                    let selector = selector.as_basic_value().into_int_value();
13222
13223                    for catch in catches.iter() {
13224                        match catch {
13225                            Catch::All { label } => {
13226                                let b = self
13227                                    .context
13228                                    .append_basic_block(self.function, "catch_all_clause");
13229                                self.builder.position_at_end(b);
13230                                let frame = self.state.frame_at_depth(*label)?;
13231
13232                                err!(self.builder.build_unconditional_branch(*frame.br_dest()));
13233
13234                                self.builder.position_at_end(catch_end_block);
13235                                catch_blocks.push((b, None));
13236                            }
13237                            Catch::One { tag, label } => {
13238                                let tag_idx = self.wasm_module.tags[TagIndex::from_u32(*tag)];
13239                                let signature = &self.wasm_module.signatures[tag_idx];
13240                                let params = signature.params();
13241
13242                                let b = self.context.append_basic_block(
13243                                    self.function,
13244                                    format!("catch_one_clause_{tag}").as_str(),
13245                                );
13246                                self.builder.position_at_end(b);
13247
13248                                let exnref_phi = err!(
13249                                    self.builder.build_phi(self.intrinsics.i32_ty, "exnref_phi")
13250                                );
13251                                exnref_phi.add_incoming(&[(&exnref, catch_end_block)]);
13252
13253                                let exn_payload_ptr = err!(self.builder.build_direct_call(
13255                                    self.intrinsics.read_exnref,
13256                                    &[self.ctx.basic().into(), exnref_phi.as_basic_value().into()],
13257                                    "exn_ptr",
13258                                ));
13259                                let exn_payload_ptr = exn_payload_ptr
13260                                    .try_as_basic_value()
13261                                    .left()
13262                                    .unwrap()
13263                                    .into_pointer_value();
13264
13265                                let values = params
13267                                    .iter()
13268                                    .enumerate()
13269                                    .map(|(i, v)| {
13270                                        let name = format!("value_{i}");
13271                                        let ptr = err!(unsafe {
13272                                            self.builder.build_gep(
13273                                                self.intrinsics.i128_ty,
13274                                                exn_payload_ptr,
13275                                                &[self
13276                                                    .intrinsics
13277                                                    .i32_ty
13278                                                    .const_int(i as u64, false)],
13279                                                format!("{name}_ptr").as_str(),
13280                                            )
13281                                        });
13282                                        err_nt!(self.builder.build_load(
13283                                            type_to_llvm(self.intrinsics, *v)?,
13284                                            ptr,
13285                                            &name,
13286                                        ))
13287                                    })
13288                                    .collect::<Result<Vec<_>, CompileError>>()?;
13289
13290                                let frame = self.state.frame_at_depth(*label)?;
13291
13292                                for (phi, value) in frame.phis().iter().zip(values.iter()) {
13293                                    phi.add_incoming(&[(value, b)])
13294                                }
13295
13296                                err!(self.builder.build_unconditional_branch(*frame.br_dest()));
13297
13298                                self.builder.position_at_end(catch_end_block);
13299                                catch_blocks.push((b, Some(exnref_phi)));
13300                            }
13301                            Catch::OneRef { label, tag } => {
13302                                let tag_idx = self.wasm_module.tags[TagIndex::from_u32(*tag)];
13303                                let signature = &self.wasm_module.signatures[tag_idx];
13304                                let params = signature.params();
13305
13306                                let b = self.context.append_basic_block(
13307                                    self.function,
13308                                    format!("catch_one_ref_clause_{tag}").as_str(),
13309                                );
13310                                self.builder.position_at_end(b);
13311
13312                                let exnref_phi = err!(
13313                                    self.builder.build_phi(self.intrinsics.i32_ty, "exnref_phi")
13314                                );
13315                                exnref_phi.add_incoming(&[(&exnref, catch_end_block)]);
13316
13317                                let exn_payload_ptr = err!(self.builder.build_direct_call(
13319                                    self.intrinsics.read_exnref,
13320                                    &[self.ctx.basic().into(), exnref_phi.as_basic_value().into()],
13321                                    "exn_ptr",
13322                                ));
13323                                let exn_payload_ptr = exn_payload_ptr
13324                                    .try_as_basic_value()
13325                                    .left()
13326                                    .unwrap()
13327                                    .into_pointer_value();
13328
13329                                let mut values = params
13331                                    .iter()
13332                                    .enumerate()
13333                                    .map(|(i, v)| {
13334                                        let name = format!("value_{i}");
13335                                        let ptr = err!(unsafe {
13336                                            self.builder.build_gep(
13337                                                self.intrinsics.i128_ty,
13338                                                exn_payload_ptr,
13339                                                &[self
13340                                                    .intrinsics
13341                                                    .i32_ty
13342                                                    .const_int(i as u64, false)],
13343                                                format!("{name}_ptr").as_str(),
13344                                            )
13345                                        });
13346                                        err_nt!(self.builder.build_load(
13347                                            type_to_llvm(self.intrinsics, *v)?,
13348                                            ptr,
13349                                            &name,
13350                                        ))
13351                                    })
13352                                    .collect::<Result<Vec<_>, CompileError>>()?;
13353
13354                                values.push(exnref_phi.as_basic_value());
13355
13356                                let frame = self.state.frame_at_depth(*label)?;
13357
13358                                for (phi, value) in frame.phis().iter().zip(values.iter()) {
13359                                    phi.add_incoming(&[(value, b)])
13360                                }
13361
13362                                err!(self.builder.build_unconditional_branch(*frame.br_dest()));
13363
13364                                self.builder.position_at_end(catch_end_block);
13365                                catch_blocks.push((b, Some(exnref_phi)));
13366                            }
13367                            Catch::AllRef { label } => {
13368                                let b = self
13369                                    .context
13370                                    .append_basic_block(self.function, "catch_all_ref_clause");
13371                                self.builder.position_at_end(b);
13372
13373                                let exnref_phi = err!(
13374                                    self.builder.build_phi(self.intrinsics.i32_ty, "exnref_phi")
13375                                );
13376                                exnref_phi.add_incoming(&[(&exnref, catch_end_block)]);
13377
13378                                let frame = self.state.frame_at_depth(*label)?;
13379
13380                                let phis = frame.phis();
13381
13382                                assert_eq!(phis.len(), 1);
13383                                phis[0].add_incoming(&[(&exnref_phi.as_basic_value(), b)]);
13384
13385                                err!(self.builder.build_unconditional_branch(*frame.br_dest()));
13386
13387                                self.builder.position_at_end(catch_end_block);
13388                                catch_blocks.push((b, Some(exnref_phi)));
13389                            }
13390                        }
13391                    }
13392
13393                    for catch_info in &outer_catch_blocks {
13394                        if let Some(phi) = catch_info.exnref_phi {
13395                            phi.add_incoming(&[(&exnref, catch_end_block)]);
13396                        }
13397                    }
13398
13399                    err!(
13400                        self.builder.build_switch(
13401                            selector,
13402                            rethrow_block,
13403                            catch_blocks
13404                                .iter()
13405                                .enumerate()
13406                                .map(|(i, v)| (
13407                                    self.intrinsics
13408                                        .i32_ty
13409                                        .const_int(catch_tag_values[i] as _, false),
13410                                    v.0
13411                                ))
13412                                .chain(outer_catch_blocks.iter().map(|catch_info| (
13413                                    self.intrinsics.i32_ty.const_int(catch_info.tag as _, false),
13414                                    catch_info.catch_block
13415                                )))
13416                                .collect::<Vec<_>>()
13417                                .as_slice()
13418                        )
13419                    );
13420
13421                    self.builder.position_at_end(rethrow_block);
13425
13426                    err!(self.builder.build_call(
13427                        self.intrinsics.throw,
13428                        &[self.ctx.basic().into(), exnref.into()],
13429                        "rethrow"
13430                    ));
13431                    err!(self.builder.build_unreachable());
13433
13434                    maybe_lpad_block = Some(lpad_block);
13435                }
13436
13437                self.builder.position_at_end(current_block);
13439
13440                let catch_tags_and_blocks = catch_tag_values
13443                    .into_iter()
13444                    .zip(catch_blocks)
13445                    .map(|(tag, (block, exnref_phi))| TagCatchInfo {
13446                        tag,
13447                        catch_block: block,
13448                        exnref_phi,
13449                    })
13450                    .collect::<Vec<_>>();
13451                self.state.push_landingpad(
13452                    maybe_lpad_block,
13453                    end_block,
13454                    end_phis,
13455                    &catch_tags_and_blocks,
13456                    self.module_translation
13457                        .blocktype_params_results(&try_table.ty)?
13458                        .0
13459                        .len(),
13460                );
13461            }
13462            Operator::Throw { tag_index } => {
13463                let current_block = self
13464                    .builder
13465                    .get_insert_block()
13466                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
13467
13468                let sig_index = self.wasm_module.tags[TagIndex::from_u32(tag_index)];
13469                let signature = &self.wasm_module.signatures[sig_index];
13470                let params = signature.params();
13471                let values = self.state.popn_save_extra(params.len())?;
13472
13473                values.iter().enumerate().try_for_each(|(i, (v, _))| {
13474                    let t = type_to_llvm(self.intrinsics, params[i])?;
13475                    if t != v.get_type() {
13476                        return Err(CompileError::Codegen(format!(
13477                            "Incompatible types: {:?} != {:?}",
13478                            t,
13479                            v.get_type()
13480                        )));
13481                    }
13482
13483                    Ok(())
13484                })?;
13485
13486                let exnref = err!(
13488                    self.builder.build_direct_call(
13489                        self.intrinsics.alloc_exception,
13490                        &[
13491                            self.ctx.basic().into(),
13492                            self.intrinsics
13493                                .i32_ty
13494                                .const_int(tag_index as _, false)
13495                                .into()
13496                        ],
13497                        "exnref",
13498                    )
13499                );
13500                let exnref = exnref.try_as_basic_value().left().unwrap();
13501
13502                let exn_payload_ptr = err!(self.builder.build_direct_call(
13503                    self.intrinsics.read_exnref,
13504                    &[self.ctx.basic().into(), exnref.into()],
13505                    "exn_ptr",
13506                ));
13507                let exn_payload_ptr = exn_payload_ptr
13508                    .try_as_basic_value()
13509                    .left()
13510                    .unwrap()
13511                    .into_pointer_value();
13512
13513                for (i, value) in values.into_iter().enumerate() {
13514                    let ptr = err!(unsafe {
13515                        self.builder.build_gep(
13516                            self.intrinsics.i128_ty,
13517                            exn_payload_ptr,
13518                            &[self.intrinsics.i32_ty.const_int(i as u64, false)],
13519                            format!("value_{i}_ptr").as_str(),
13520                        )
13521                    });
13522                    err!(self.builder.build_store(ptr, value.0));
13523                }
13524
13525                if let Some(pad) = self.state.get_innermost_landingpad() {
13526                    let unreachable_block = self
13527                        .context
13528                        .append_basic_block(self.function, "_throw_unreachable");
13529
13530                    err!(self.builder.build_invoke(
13531                        self.intrinsics.throw,
13532                        &[self.ctx.basic(), exnref],
13533                        unreachable_block,
13534                        pad,
13535                        "throw",
13536                    ));
13537
13538                    self.builder.position_at_end(unreachable_block);
13539                    err!(self.builder.build_unreachable());
13541
13542                    self.builder.position_at_end(current_block);
13543                } else {
13544                    err!(self.builder.build_call(
13545                        self.intrinsics.throw,
13546                        &[self.ctx.basic().into(), exnref.into()],
13547                        "throw"
13548                    ));
13549                    err!(self.builder.build_unreachable());
13551                }
13552
13553                self.state.reachable = false;
13554            }
13555            Operator::ThrowRef => {
13556                let current_block = self
13557                    .builder
13558                    .get_insert_block()
13559                    .ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
13560
13561                let exnref = self.state.pop1()?;
13562
13563                if let Some(pad) = self.state.get_innermost_landingpad() {
13564                    let unreachable_block = self
13565                        .context
13566                        .append_basic_block(self.function, "_rethrow_unreachable");
13567
13568                    err!(self.builder.build_invoke(
13569                        self.intrinsics.throw,
13570                        &[self.ctx.basic(), exnref],
13571                        unreachable_block,
13572                        pad,
13573                        "throw",
13574                    ));
13575
13576                    self.builder.position_at_end(unreachable_block);
13577                    err!(self.builder.build_unreachable());
13579
13580                    self.builder.position_at_end(current_block);
13581                } else {
13582                    err!(self.builder.build_call(
13583                        self.intrinsics.throw,
13584                        &[self.ctx.basic().into(), exnref.into()],
13585                        "throw"
13586                    ));
13587                    err!(self.builder.build_unreachable());
13589                }
13590
13591                self.state.reachable = false;
13592            }
13593            _ => {
13594                return Err(CompileError::Codegen(format!(
13595                    "Operator {op:?} unimplemented",
13596                )));
13597            }
13598        }
13599
13600        Ok(())
13601    }
13602}
13603
13604fn is_f32_arithmetic(bits: u32) -> bool {
13605    let bits = bits & 0x7FFF_FFFF;
13607    bits < 0x7FC0_0000
13608}
13609
13610fn is_f64_arithmetic(bits: u64) -> bool {
13611    let bits = bits & 0x7FFF_FFFF_FFFF_FFFF;
13613    bits < 0x7FF8_0000_0000_0000
13614}
13615
13616const LEF32_GEQ_I32_MIN: u64 = i32::MIN as u64;
13624const GEF32_LEQ_I32_MAX: u64 = 2147483520; const LEF64_GEQ_I32_MIN: u64 = i32::MIN as u64;
13628const GEF64_LEQ_I32_MAX: u64 = i32::MAX as u64;
13630const LEF32_GEQ_U32_MIN: u64 = u32::MIN as u64;
13632const GEF32_LEQ_U32_MAX: u64 = 4294967040; const LEF64_GEQ_U32_MIN: u64 = u32::MIN as u64;
13636const GEF64_LEQ_U32_MAX: u64 = 4294967295; const LEF32_GEQ_I64_MIN: u64 = i64::MIN as u64;
13640const GEF32_LEQ_I64_MAX: u64 = 9223371487098961920; const LEF64_GEQ_I64_MIN: u64 = i64::MIN as u64;
13644const GEF64_LEQ_I64_MAX: u64 = 9223372036854774784; const LEF32_GEQ_U64_MIN: u64 = u64::MIN;
13648const GEF32_LEQ_U64_MAX: u64 = 18446742974197923840; const LEF64_GEQ_U64_MIN: u64 = u64::MIN;
13652const GEF64_LEQ_U64_MAX: u64 = 18446744073709549568;