Repository: bytecodealliance/wasmtime
Pull request #9399 (2024-10-08 19:53:53)

Bump wasm-tools crates to 219
Keeping up-to-date

<!--
Please make sure you include the following information:

- If this work has been discussed elsewhere, please include a link to that
  conversation. If it was discussed in an issue, just mention "issue #...".

- Explain why this change is needed. If the details are in an issue already,
  this can be brief.

Our development process is documented in the Wasmtime book:
https://docs.wasmtime.dev/contributing-development-process.html

Please ensure all communication follows the code of conduct:
https://github.com/bytecodealliance/wasmtime/blob/main/CODE_OF_CONDUCT.md
-->



Patch:
diff --git a/Cargo.lock b/Cargo.lock
index 9d110b50d..2bc6313f6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2897,7 +2897,7 @@ dependencies = [
  "cargo_metadata",
  "heck 0.5.0",
  "wasmtime",
- "wit-component",
+ "wit-component 0.219.0",
 ]
 
 [[package]]
@@ -3258,7 +3258,7 @@ name = "verify-component-adapter"
 version = "27.0.0"
 dependencies = [
  "anyhow",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wat",
 ]
 
@@ -3351,7 +3351,7 @@ dependencies = [
  "byte-array-literals",
  "object",
  "wasi",
- "wasm-encoder",
+ "wasm-encoder 0.219.0",
  "wit-bindgen-rust-macro",
 ]
 
@@ -3416,7 +3416,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "22b896fa8ceb71091ace9bcb81e853f54043183a1c9667cf93422c40252ffa0a"
 dependencies = [
  "leb128",
- "wasmparser",
+ "wasmparser 0.218.0",
+]
+
+[[package]]
+name = "wasm-encoder"
+version = "0.219.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2b1b95711b3ad655656a341e301cc64e33cbee94de9a99a1c5a2ab88efab79d"
+dependencies = [
+ "leb128",
+ "wasmparser 0.219.0",
 ]
 
 [[package]]
@@ -3431,36 +3441,52 @@ dependencies = [
  "serde_derive",
  "serde_json",
  "spdx",
- "wasm-encoder",
- "wasmparser",
+ "wasm-encoder 0.218.0",
+ "wasmparser 0.218.0",
+]
+
+[[package]]
+name = "wasm-metadata"
+version = "0.219.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96132fe00dd17d092d2be289eeed5a0a68ad3cf30b68e8875bc953b96f55f0be"
+dependencies = [
+ "anyhow",
+ "indexmap 2.2.6",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "spdx",
+ "wasm-encoder 0.219.0",
+ "wasmparser 0.219.0",
 ]
 
 [[package]]
 name = "wasm-mutate"
-version = "0.218.0"
+version = "0.219.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17197857afe3d1569d6d42bfb52cf7999ee70090630213f73e035bec2e5922e4"
+checksum = "94295e8974bd5b547492f028851a9c9aae45df8075b40424d4ef72f7edf10605"
 dependencies = [
  "egg",
  "log",
  "rand",
  "thiserror",
- "wasm-encoder",
- "wasmparser",
+ "wasm-encoder 0.219.0",
+ "wasmparser 0.219.0",
 ]
 
 [[package]]
 name = "wasm-smith"
-version = "0.218.0"
+version = "0.219.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b533994f2242064bf512b31d47380e4ea9acc85ffec09fc07db61300261793f7"
+checksum = "318c50953daf236696ce547c6cf3c499137a3e46ab5b74c1a248e333c5d1d517"
 dependencies = [
  "anyhow",
  "arbitrary",
  "flagset",
  "indexmap 2.2.6",
  "leb128",
- "wasm-encoder",
+ "wasm-encoder 0.219.0",
 ]
 
 [[package]]
@@ -3508,6 +3534,19 @@ name = "wasmparser"
 version = "0.218.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b09e46c7fceceaa72b2dd1a8a137ea7fd8f93dfaa69806010a709918e496c5dc"
+dependencies = [
+ "ahash",
+ "bitflags 2.6.0",
+ "hashbrown 0.14.3",
+ "indexmap 2.2.6",
+ "semver",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.219.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "324b4e56d24439495b88cd81439dad5e97f3c7b1eedc3c7e10455ed1e045e9a2"
 dependencies = [
  "ahash",
  "bitflags 2.6.0",
@@ -3528,13 +3567,13 @@ dependencies = [
 
 [[package]]
 name = "wasmprinter"
-version = "0.218.0"
+version = "0.219.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ace089155491837b75f474bf47c99073246d1b737393fe722d6dee311595ddc"
+checksum = "22cdac6eee8166b6bc319166483ea8f68ffaf9d378da5fff1dd4ce0af76b597a"
 dependencies = [
  "anyhow",
  "termcolor",
- "wasmparser",
+ "wasmparser 0.219.0",
 ]
 
 [[package]]
@@ -3579,8 +3618,8 @@ dependencies = [
  "target-lexicon",
  "tempfile",
  "wasi-common",
- "wasm-encoder",
- "wasmparser",
+ "wasm-encoder 0.219.0",
+ "wasmparser 0.219.0",
  "wasmtime-asm-macros",
  "wasmtime-cache",
  "wasmtime-component-macro",
@@ -3724,7 +3763,7 @@ dependencies = [
  "tracing",
  "walkdir",
  "wasi-common",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wasmtime",
  "wasmtime-cache",
  "wasmtime-cli-flags",
@@ -3740,10 +3779,10 @@ dependencies = [
  "wasmtime-wasi-runtime-config",
  "wasmtime-wasi-threads",
  "wasmtime-wast",
- "wast 218.0.0",
+ "wast 219.0.0",
  "wat",
  "windows-sys 0.59.0",
- "wit-component",
+ "wit-component 0.219.0",
 ]
 
 [[package]]
@@ -3776,7 +3815,7 @@ dependencies = [
  "wasmtime",
  "wasmtime-component-util",
  "wasmtime-wit-bindgen",
- "wit-parser",
+ "wit-parser 0.219.0",
 ]
 
 [[package]]
@@ -3801,7 +3840,7 @@ dependencies = [
  "smallvec",
  "target-lexicon",
  "thiserror",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wasmtime-environ",
  "wasmtime-versioned-export-macros",
 ]
@@ -3827,8 +3866,8 @@ dependencies = [
  "serde_derive",
  "smallvec",
  "target-lexicon",
- "wasm-encoder",
- "wasmparser",
+ "wasm-encoder 0.219.0",
+ "wasmparser 0.219.0",
  "wasmprinter",
  "wasmtime-component-util",
  "wat",
@@ -3842,7 +3881,7 @@ dependencies = [
  "component-fuzz-util",
  "env_logger 0.11.5",
  "libfuzzer-sys",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wasmprinter",
  "wasmtime-environ",
  "wat",
@@ -3902,7 +3941,7 @@ dependencies = [
  "rand",
  "smallvec",
  "target-lexicon",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wasmtime",
  "wasmtime-fuzzing",
 ]
@@ -3923,12 +3962,12 @@ dependencies = [
  "target-lexicon",
  "tempfile",
  "v8",
- "wasm-encoder",
+ "wasm-encoder 0.219.0",
  "wasm-mutate",
  "wasm-smith",
  "wasm-spec-interpreter",
  "wasmi",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wasmprinter",
  "wasmtime",
  "wasmtime-wast",
@@ -4098,7 +4137,7 @@ dependencies = [
  "anyhow",
  "log",
  "wasmtime",
- "wast 218.0.0",
+ "wast 219.0.0",
 ]
 
 [[package]]
@@ -4110,7 +4149,7 @@ dependencies = [
  "gimli",
  "object",
  "target-lexicon",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wasmtime-cranelift",
  "wasmtime-environ",
  "winch-codegen",
@@ -4123,7 +4162,7 @@ dependencies = [
  "anyhow",
  "heck 0.5.0",
  "indexmap 2.2.6",
- "wit-parser",
+ "wit-parser 0.219.0",
 ]
 
 [[package]]
@@ -4141,24 +4180,24 @@ dependencies = [
 
 [[package]]
 name = "wast"
-version = "218.0.0"
+version = "219.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a53cd1f0fa505df97557e36a58bddb8296e2fcdcd089529545ebfdb18a1b9d7"
+checksum = "06880ecb25662bc21db6a83f4fcc27c41f71fbcba4f1980b650c88ada92728e1"
 dependencies = [
  "bumpalo",
  "leb128",
  "memchr",
  "unicode-width",
- "wasm-encoder",
+ "wasm-encoder 0.219.0",
 ]
 
 [[package]]
 name = "wat"
-version = "1.218.0"
+version = "1.219.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f87f8e14e776762e07927c27c2054d2cf678aab9aae2d431a79b3e31e4dd391"
+checksum = "11e56dbf9fc89111b0d97c91e683d7895b1a6e5633a729f2ccad2303724005b6"
 dependencies = [
- "wast 218.0.0",
+ "wast 219.0.0",
 ]
 
 [[package]]
@@ -4299,7 +4338,7 @@ dependencies = [
  "regalloc2",
  "smallvec",
  "target-lexicon",
- "wasmparser",
+ "wasmparser 0.219.0",
  "wasmtime-cranelift",
  "wasmtime-environ",
 ]
@@ -4538,7 +4577,7 @@ checksum = "4b885a00e1c428fd12b7b7c4bccc4bad8b2a3ca0abe8eaf1e0f90adabb4c7ac7"
 dependencies = [
  "anyhow",
  "heck 0.5.0",
- "wit-parser",
+ "wit-parser 0.218.0",
 ]
 
 [[package]]
@@ -4561,9 +4600,9 @@ dependencies = [
  "indexmap 2.2.6",
  "prettyplease",
  "syn 2.0.60",
- "wasm-metadata",
+ "wasm-metadata 0.218.0",
  "wit-bindgen-core",
- "wit-component",
+ "wit-component 0.218.0",
 ]
 
 [[package]]
@@ -4594,10 +4633,29 @@ dependencies = [
  "serde",
  "serde_derive",
  "serde_json",
- "wasm-encoder",
- "wasm-metadata",
- "wasmparser",
- "wit-parser",
+ "wasm-encoder 0.218.0",
+ "wasm-metadata 0.218.0",
+ "wasmparser 0.218.0",
+ "wit-parser 0.218.0",
+]
+
+[[package]]
+name = "wit-component"
+version = "0.219.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99a76111c20444a814019de20499d30940ecd219b9512ee296f034a5edb18a2d"
+dependencies = [
+ "anyhow",
+ "bitflags 2.6.0",
+ "indexmap 2.2.6",
+ "log",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "wasm-encoder 0.219.0",
+ "wasm-metadata 0.219.0",
+ "wasmparser 0.219.0",
+ "wit-parser 0.219.0",
 ]
 
 [[package]]
@@ -4615,7 +4673,25 @@ dependencies = [
  "serde_derive",
  "serde_json",
  "unicode-xid",
- "wasmparser",
+ "wasmparser 0.218.0",
+]
+
+[[package]]
+name = "wit-parser"
+version = "0.219.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23102e180c0c464f36e293d31a27b524e3ece930d7b5527d2f33f9d2c963de64"
+dependencies = [
+ "anyhow",
+ "id-arena",
+ "indexmap 2.2.6",
+ "log",
+ "semver",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "unicode-xid",
+ "wasmparser 0.219.0",
 ]
 
 [[package]]
diff --git a/Cargo.toml b/Cargo.toml
index 8fa098ae0..d80e7f55b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -275,15 +275,15 @@ wit-bindgen = { version = "0.33.0", default-features = false }
 wit-bindgen-rust-macro = { version = "0.33.0", default-features = false }
 
 # wasm-tools family:
-wasmparser = { version = "0.218.0", default-features = false }
-wat = "1.218.0"
-wast = "218.0.0"
-wasmprinter = "0.218.0"
-wasm-encoder = "0.218.0"
-wasm-smith = "0.218.0"
-wasm-mutate = "0.218.0"
-wit-parser = "0.218.0"
-wit-component = "0.218.0"
+wasmparser = { version = "0.219.0", default-features = false }
+wat = "1.219.0"
+wast = "219.0.0"
+wasmprinter = "0.219.0"
+wasm-encoder = "0.219.0"
+wasm-smith = "0.219.0"
+wasm-mutate = "0.219.0"
+wit-parser = "0.219.0"
+wit-component = "0.219.0"
 
 # Non-Bytecode Alliance maintained dependencies:
 # --------------------------
diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle
index 40a7d7deb..a6f0af46a 100644
--- a/cranelift/codegen/src/isa/x64/lower.isle
+++ b/cranelift/codegen/src/isa/x64/lower.isle
@@ -2161,7 +2161,7 @@
 ;; instruction plus a `CMOV`; recall that `cmove_from_values` here may emit more
 ;; than one instruction for certain types (e.g., XMM-held, I128).
 
-(rule (lower (has_type ty (select (maybe_uextend (icmp cc a @ (value_type (fits_in_64 a_ty)) b)) x y)))
+(rule (lower (has_type ty (select (maybe_uextend (icmp cc a b)) x y)))
       (lower_select_icmp ty (emit_cmp cc a b) x y))
 
 ;; Finally, we lower `select` from a condition value `c`. These rules are meant
diff --git a/crates/cranelift/src/translate/code_translator.rs b/crates/cranelift/src/translate/code_translator.rs
index c332edb22..b7272b2e2 100644
--- a/crates/cranelift/src/translate/code_translator.rs
+++ b/crates/cranelift/src/translate/code_translator.rs
@@ -2792,6 +2792,15 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
                 "stack-switching operators are not yet implemented"
             ));
         }
+
+        Operator::I64Add128
+        | Operator::I64Sub128
+        | Operator::I64MulWideS
+        | Operator::I64MulWideU => {
+            return Err(wasm_unsupported!(
+                "wide-arithmetic operators are not yet implemented"
+            ));
+        }
     };
     Ok(())
 }
diff --git a/crates/environ/Cargo.toml b/crates/environ/Cargo.toml
index b7d83c13c..c12593ec0 100644
--- a/crates/environ/Cargo.toml
+++ b/crates/environ/Cargo.toml
@@ -48,7 +48,11 @@ name = "factc"
 required-features = ['component-model', 'compile']
 
 [features]
-component-model = ["dep:wasmtime-component-util", "dep:semver"]
+component-model = [
+  "dep:wasmtime-component-util",
+  "dep:semver",
+  "wasmparser/component-model",
+]
 demangle = ['std', 'dep:rustc-demangle', 'dep:cpp_demangle']
 gc = []
 compile = [
diff --git a/crates/environ/examples/factc.rs b/crates/environ/examples/factc.rs
index ac55c4296..2c692a926 100644
--- a/crates/environ/examples/factc.rs
+++ b/crates/environ/examples/factc.rs
@@ -127,7 +127,7 @@ impl Factc {
         let wasm_types = wasm_types.as_ref();
         for i in 0..wasm_types.component_type_count() {
             let ty = match wasm_types.component_any_type_at(i) {
-                wasmparser::types::ComponentAnyTypeId::Func(id) => id,
+                wasmparser::component_types::ComponentAnyTypeId::Func(id) => id,
                 _ => continue,
             };
             let ty = types.convert_component_func_type(wasm_types, ty)?;
diff --git a/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs b/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs
index cb7d85e02..2995aab75 100644
--- a/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs
+++ b/crates/environ/fuzz/fuzz_targets/fact-valid-module.rs
@@ -12,7 +12,7 @@
 use arbitrary::Unstructured;
 use component_fuzz_util::{TestCase, Type, MAX_TYPE_DEPTH};
 use libfuzzer_sys::fuzz_target;
-use wasmparser::types::ComponentAnyTypeId;
+use wasmparser::component_types::ComponentAnyTypeId;
 use wasmparser::{Parser, Payload, Validator, WasmFeatures};
 use wasmtime_environ::component::*;
 use wasmtime_environ::fact::Module;
diff --git a/crates/environ/src/compile/module_environ.rs b/crates/environ/src/compile/module_environ.rs
index 416384b04..6a9783635 100644
--- a/crates/environ/src/compile/module_environ.rs
+++ b/crates/environ/src/compile/module_environ.rs
@@ -239,7 +239,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> {
             Payload::TypeSection(types) => {
                 self.validator.type_section(&types)?;
 
-                let count = self.validator.types(0).unwrap().core_type_count();
+                let count = self.validator.types(0).unwrap().core_type_count_in_module();
                 log::trace!("interning {count} Wasm types");
 
                 let capacity = usize::try_from(count).unwrap();
@@ -262,7 +262,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> {
                     // Get the rec group for the current type index, which is
                     // always the first type defined in a rec group.
                     log::trace!("looking up wasmparser type for index {type_index}");
-                    let core_type_id = validator_types.core_type_at(type_index).unwrap_sub();
+                    let core_type_id = validator_types.core_type_at_in_module(type_index);
                     log::trace!(
                         "  --> {core_type_id:?} = {:?}",
                         validator_types[core_type_id],
diff --git a/crates/environ/src/component/dfg.rs b/crates/environ/src/component/dfg.rs
index 1bf88819f..a2a78c564 100644
--- a/crates/environ/src/component/dfg.rs
+++ b/crates/environ/src/component/dfg.rs
@@ -35,7 +35,7 @@ use indexmap::IndexMap;
 use std::collections::HashMap;
 use std::hash::Hash;
 use std::ops::Index;
-use wasmparser::types::ComponentCoreModuleTypeId;
+use wasmparser::component_types::ComponentCoreModuleTypeId;
 
 #[derive(Default)]
 #[allow(missing_docs)]
diff --git a/crates/environ/src/component/translate.rs b/crates/environ/src/component/translate.rs
index ee7b9b89e..3b8b92cc1 100644
--- a/crates/environ/src/component/translate.rs
+++ b/crates/environ/src/component/translate.rs
@@ -12,10 +12,11 @@ use anyhow::{bail, Result};
 use indexmap::IndexMap;
 use std::collections::HashMap;
 use std::mem;
-use wasmparser::types::{
+use wasmparser::component_types::{
     AliasableResourceId, ComponentCoreModuleTypeId, ComponentEntityType, ComponentFuncTypeId,
-    ComponentInstanceTypeId, Types,
+    ComponentInstanceTypeId,
 };
+use wasmparser::types::Types;
 use wasmparser::{Chunk, ComponentImportName, Encoding, Parser, Payload, Validator};
 
 mod adapt;
diff --git a/crates/environ/src/component/translate/inline.rs b/crates/environ/src/component/translate/inline.rs
index 6953199bb..b75b0509a 100644
--- a/crates/environ/src/component/translate/inline.rs
+++ b/crates/environ/src/component/translate/inline.rs
@@ -48,7 +48,7 @@
 use crate::component::translate::*;
 use crate::{EntityType, IndexType};
 use std::borrow::Cow;
-use wasmparser::types::{ComponentAnyTypeId, ComponentCoreModuleTypeId};
+use wasmparser::component_types::{ComponentAnyTypeId, ComponentCoreModuleTypeId};
 
 pub(super) fn run(
     types: &mut ComponentTypesBuilder,
diff --git a/crates/environ/src/component/types.rs b/crates/environ/src/component/types.rs
index 8d53d9c09..6d99e1f55 100644
--- a/crates/environ/src/component/types.rs
+++ b/crates/environ/src/component/types.rs
@@ -4,7 +4,7 @@ use crate::{EntityType, ModuleInternedTypeIndex, ModuleTypes, PrimaryMap};
 use core::hash::{Hash, Hasher};
 use core::ops::Index;
 use serde_derive::{Deserialize, Serialize};
-use wasmparser::types;
+use wasmparser::component_types::ComponentAnyTypeId;
 use wasmtime_component_util::{DiscriminantSize, FlagsSize};
 
 pub use crate::StaticModuleIndex;
@@ -214,7 +214,7 @@ pub enum ComponentItem {
     Module(ModuleIndex),
     Component(ComponentIndex),
     ComponentInstance(ComponentInstanceIndex),
-    Type(types::ComponentAnyTypeId),
+    Type(ComponentAnyTypeId),
 }
 
 /// Runtime information about the type information contained within a component.
diff --git a/crates/environ/src/component/types_builder.rs b/crates/environ/src/component/types_builder.rs
index a26c8ffc5..c43b65616 100644
--- a/crates/environ/src/component/types_builder.rs
+++ b/crates/environ/src/component/types_builder.rs
@@ -9,8 +9,14 @@ use cranelift_entity::EntityRef;
 use std::collections::HashMap;
 use std::hash::Hash;
 use std::ops::Index;
+use wasmparser::component_types::{
+    ComponentAnyTypeId, ComponentCoreModuleTypeId, ComponentDefinedType, ComponentDefinedTypeId,
+    ComponentEntityType, ComponentFuncTypeId, ComponentInstanceTypeId, ComponentTypeId,
+    ComponentValType, RecordType, ResourceId, TupleType, VariantType,
+};
 use wasmparser::names::KebabString;
-use wasmparser::{types, Validator};
+use wasmparser::types::TypesRef;
+use wasmparser::Validator;
 use wasmtime_component_util::FlagsSize;
 
 mod resources;
@@ -193,8 +199,8 @@ impl ComponentTypesBuilder {
     /// representation.
     pub fn convert_component_func_type(
         &mut self,
-        types: types::TypesRef<'_>,
-        id: types::ComponentFuncTypeId,
+        types: TypesRef<'_>,
+        id: ComponentFuncTypeId,
     ) -> Result<TypeFuncIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let ty = &types[id];
@@ -219,66 +225,56 @@ impl ComponentTypesBuilder {
     /// representation.
     pub fn convert_component_entity_type(
         &mut self,
-        types: types::TypesRef<'_>,
-        ty: types::ComponentEntityType,
+        types: TypesRef<'_>,
+        ty: ComponentEntityType,
     ) -> Result<TypeDef> {
         assert_eq!(types.id(), self.module_types.validator_id());
         Ok(match ty {
-            types::ComponentEntityType::Module(id) => {
-                TypeDef::Module(self.convert_module(types, id)?)
-            }
-            types::ComponentEntityType::Component(id) => {
+            ComponentEntityType::Module(id) => TypeDef::Module(self.convert_module(types, id)?),
+            ComponentEntityType::Component(id) => {
                 TypeDef::Component(self.convert_component(types, id)?)
             }
-            types::ComponentEntityType::Instance(id) => {
+            ComponentEntityType::Instance(id) => {
                 TypeDef::ComponentInstance(self.convert_instance(types, id)?)
             }
-            types::ComponentEntityType::Func(id) => {
+            ComponentEntityType::Func(id) => {
                 TypeDef::ComponentFunc(self.convert_component_func_type(types, id)?)
             }
-            types::ComponentEntityType::Type { created, .. } => match created {
-                types::ComponentAnyTypeId::Defined(id) => {
+            ComponentEntityType::Type { created, .. } => match created {
+                ComponentAnyTypeId::Defined(id) => {
                     TypeDef::Interface(self.defined_type(types, id)?)
                 }
-                types::ComponentAnyTypeId::Resource(id) => {
+                ComponentAnyTypeId::Resource(id) => {
                     TypeDef::Resource(self.resource_id(id.resource()))
                 }
                 _ => bail!("unsupported type export"),
             },
-            types::ComponentEntityType::Value(_) => bail!("values not supported"),
+            ComponentEntityType::Value(_) => bail!("values not supported"),
         })
     }
 
     /// Converts a wasmparser `Type` into Wasmtime's type representation.
-    pub fn convert_type(
-        &mut self,
-        types: types::TypesRef<'_>,
-        id: types::ComponentAnyTypeId,
-    ) -> Result<TypeDef> {
+    pub fn convert_type(&mut self, types: TypesRef<'_>, id: ComponentAnyTypeId) -> Result<TypeDef> {
         assert_eq!(types.id(), self.module_types.validator_id());
         Ok(match id {
-            types::ComponentAnyTypeId::Defined(id) => {
-                TypeDef::Interface(self.defined_type(types, id)?)
-            }
-            types::ComponentAnyTypeId::Component(id) => {
+            ComponentAnyTypeId::Defined(id) => TypeDef::Interface(self.defined_type(types, id)?),
+            ComponentAnyTypeId::Component(id) => {
                 TypeDef::Component(self.convert_component(types, id)?)
             }
-            types::ComponentAnyTypeId::Instance(id) => {
+            ComponentAnyTypeId::Instance(id) => {
                 TypeDef::ComponentInstance(self.convert_instance(types, id)?)
             }
-            types::ComponentAnyTypeId::Func(id) => {
+            ComponentAnyTypeId::Func(id) => {
                 TypeDef::ComponentFunc(self.convert_component_func_type(types, id)?)
             }
-            types::ComponentAnyTypeId::Resource(id) => {
-                TypeDef::Resource(self.resource_id(id.resource()))
-            }
+            ComponentAnyTypeId::Resource(id) => TypeDef::Resource(self.resource_id(id.resource())),
         })
     }
 
     fn convert_component(
         &mut self,
-        types: types::TypesRef<'_>,
-        id: types::ComponentTypeId,
+        types: TypesRef<'_>,
+        id: ComponentTypeId,
     ) -> Result<TypeComponentIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let ty = &types[id];
@@ -300,8 +296,8 @@ impl ComponentTypesBuilder {
 
     pub(crate) fn convert_instance(
         &mut self,
-        types: types::TypesRef<'_>,
-        id: types::ComponentInstanceTypeId,
+        types: TypesRef<'_>,
+        id: ComponentInstanceTypeId,
     ) -> Result<TypeComponentInstanceIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let ty = &types[id];
@@ -317,8 +313,8 @@ impl ComponentTypesBuilder {
 
     pub(crate) fn convert_module(
         &mut self,
-        types: types::TypesRef<'_>,
-        id: types::ComponentCoreModuleTypeId,
+        types: TypesRef<'_>,
+        id: ComponentCoreModuleTypeId,
     ) -> Result<TypeModuleIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let ty = &types[id];
@@ -339,54 +335,48 @@ impl ComponentTypesBuilder {
 
     fn entity_type(
         &mut self,
-        types: types::TypesRef<'_>,
-        ty: &types::EntityType,
+        types: TypesRef<'_>,
+        ty: &wasmparser::types::EntityType,
     ) -> Result<EntityType> {
+        use wasmparser::types::EntityType::*;
+
         assert_eq!(types.id(), self.module_types.validator_id());
         Ok(match ty {
-            types::EntityType::Func(id) => EntityType::Function({
+            Func(id) => EntityType::Function({
                 let module = Module::default();
                 self.module_types_builder_mut()
                     .intern_type(&module, types, *id)?
                     .into()
             }),
-            types::EntityType::Table(ty) => EntityType::Table(self.convert_table_type(ty)?),
-            types::EntityType::Memory(ty) => EntityType::Memory((*ty).into()),
-            types::EntityType::Global(ty) => EntityType::Global(self.convert_global_type(ty)),
-            types::EntityType::Tag(_) => bail!("exceptions proposal not implemented"),
+            Table(ty) => EntityType::Table(self.convert_table_type(ty)?),
+            Memory(ty) => EntityType::Memory((*ty).into()),
+            Global(ty) => EntityType::Global(self.convert_global_type(ty)),
+            Tag(_) => bail!("exceptions proposal not implemented"),
         })
     }
 
     fn defined_type(
         &mut self,
-        types: types::TypesRef<'_>,
-        id: types::ComponentDefinedTypeId,
+        types: TypesRef<'_>,
+        id: ComponentDefinedTypeId,
     ) -> Result<InterfaceType> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let ret = match &types[id] {
-            types::ComponentDefinedType::Primitive(ty) => ty.into(),
-            types::ComponentDefinedType::Record(e) => {
-                InterfaceType::Record(self.record_type(types, e)?)
-            }
-            types::ComponentDefinedType::Variant(e) => {
+            ComponentDefinedType::Primitive(ty) => ty.into(),
+            ComponentDefinedType::Record(e) => InterfaceType::Record(self.record_type(types, e)?),
+            ComponentDefinedType::Variant(e) => {
                 InterfaceType::Variant(self.variant_type(types, e)?)
             }
-            types::ComponentDefinedType::List(e) => InterfaceType::List(self.list_type(types, e)?),
-            types::ComponentDefinedType::Tuple(e) => {
-                InterfaceType::Tuple(self.tuple_type(types, e)?)
-            }
-            types::ComponentDefinedType::Flags(e) => InterfaceType::Flags(self.flags_type(e)),
-            types::ComponentDefinedType::Enum(e) => InterfaceType::Enum(self.enum_type(e)),
-            types::ComponentDefinedType::Option(e) => {
-                InterfaceType::Option(self.option_type(types, e)?)
-            }
-            types::ComponentDefinedType::Result { ok, err } => {
+            ComponentDefinedType::List(e) => InterfaceType::List(self.list_type(types, e)?),
+            ComponentDefinedType::Tuple(e) => InterfaceType::Tuple(self.tuple_type(types, e)?),
+            ComponentDefinedType::Flags(e) => InterfaceType::Flags(self.flags_type(e)),
+            ComponentDefinedType::Enum(e) => InterfaceType::Enum(self.enum_type(e)),
+            ComponentDefinedType::Option(e) => InterfaceType::Option(self.option_type(types, e)?),
+            ComponentDefinedType::Result { ok, err } => {
                 InterfaceType::Result(self.result_type(types, ok, err)?)
             }
-            types::ComponentDefinedType::Own(r) => {
-                InterfaceType::Own(self.resource_id(r.resource()))
-            }
-            types::ComponentDefinedType::Borrow(r) => {
+            ComponentDefinedType::Own(r) => InterfaceType::Own(self.resource_id(r.resource())),
+            ComponentDefinedType::Borrow(r) => {
                 InterfaceType::Borrow(self.resource_id(r.resource()))
             }
         };
@@ -397,23 +387,15 @@ impl ComponentTypesBuilder {
         Ok(ret)
     }
 
-    fn valtype(
-        &mut self,
-        types: types::TypesRef<'_>,
-        ty: &types::ComponentValType,
-    ) -> Result<InterfaceType> {
+    fn valtype(&mut self, types: TypesRef<'_>, ty: &ComponentValType) -> Result<InterfaceType> {
         assert_eq!(types.id(), self.module_types.validator_id());
         match ty {
-            types::ComponentValType::Primitive(p) => Ok(p.into()),
-            types::ComponentValType::Type(id) => self.defined_type(types, *id),
+            ComponentValType::Primitive(p) => Ok(p.into()),
+            ComponentValType::Type(id) => self.defined_type(types, *id),
         }
     }
 
-    fn record_type(
-        &mut self,
-        types: types::TypesRef<'_>,
-        ty: &types::RecordType,
-    ) -> Result<TypeRecordIndex> {
+    fn record_type(&mut self, types: TypesRef<'_>, ty: &RecordType) -> Result<TypeRecordIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let fields = ty
             .fields
@@ -433,11 +415,7 @@ impl ComponentTypesBuilder {
         Ok(self.add_record_type(TypeRecord { fields, abi }))
     }
 
-    fn variant_type(
-        &mut self,
-        types: types::TypesRef<'_>,
-        ty: &types::VariantType,
-    ) -> Result<TypeVariantIndex> {
+    fn variant_type(&mut self, types: TypesRef<'_>, ty: &VariantType) -> Result<TypeVariantIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let cases = ty
             .cases
@@ -465,11 +443,7 @@ impl ComponentTypesBuilder {
         Ok(self.add_variant_type(TypeVariant { cases, abi, info }))
     }
 
-    fn tuple_type(
-        &mut self,
-        types: types::TypesRef<'_>,
-        ty: &types::TupleType,
-    ) -> Result<TypeTupleIndex> {
+    fn tuple_type(&mut self, types: TypesRef<'_>, ty: &TupleType) -> Result<TypeTupleIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let types = ty
             .types
@@ -507,8 +481,8 @@ impl ComponentTypesBuilder {
 
     fn option_type(
         &mut self,
-        types: types::TypesRef<'_>,
-        ty: &types::ComponentValType,
+        types: TypesRef<'_>,
+        ty: &ComponentValType,
     ) -> Result<TypeOptionIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let ty = self.valtype(types, ty)?;
@@ -518,9 +492,9 @@ impl ComponentTypesBuilder {
 
     fn result_type(
         &mut self,
-        types: types::TypesRef<'_>,
-        ok: &Option<types::ComponentValType>,
-        err: &Option<types::ComponentValType>,
+        types: TypesRef<'_>,
+        ok: &Option<ComponentValType>,
+        err: &Option<ComponentValType>,
     ) -> Result<TypeResultIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let ok = match ok {
@@ -538,11 +512,7 @@ impl ComponentTypesBuilder {
         Ok(self.add_result_type(TypeResult { ok, err, abi, info }))
     }
 
-    fn list_type(
-        &mut self,
-        types: types::TypesRef<'_>,
-        ty: &types::ComponentValType,
-    ) -> Result<TypeListIndex> {
+    fn list_type(&mut self, types: TypesRef<'_>, ty: &ComponentValType) -> Result<TypeListIndex> {
         assert_eq!(types.id(), self.module_types.validator_id());
         let element = self.valtype(types, ty)?;
         Ok(self.add_list_type(TypeList { element }))
@@ -550,7 +520,7 @@ impl ComponentTypesBuilder {
 
     /// Converts a wasmparser `id`, which must point to a resource, to its
     /// corresponding `TypeResourceTableIndex`.
-    pub fn resource_id(&mut self, id: types::ResourceId) -> TypeResourceTableIndex {
+    pub fn resource_id(&mut self, id: ResourceId) -> TypeResourceTableIndex {
         self.resources.convert(id, &mut self.component_types)
     }
 
diff --git a/crates/environ/src/component/types_builder/resources.rs b/crates/environ/src/component/types_builder/resources.rs
index fc9e07605..d02426d49 100644
--- a/crates/environ/src/component/types_builder/resources.rs
+++ b/crates/environ/src/component/types_builder/resources.rs
@@ -73,7 +73,8 @@ use crate::component::{
 };
 use crate::prelude::*;
 use std::collections::HashMap;
-use wasmparser::types;
+use wasmparser::component_types::{ComponentAnyTypeId, ComponentEntityType, ResourceId};
+use wasmparser::types::TypesRef;
 
 /// Builder state used to translate wasmparser's `ResourceId` types to
 /// Wasmtime's `TypeResourceTableIndex` type.
@@ -111,7 +112,7 @@ pub struct ResourcesBuilder {
     /// A cache of previously visited `ResourceId` items and which table they
     /// correspond to. This is lazily populated as resources are visited and is
     /// exclusively used by the `convert` function below.
-    resource_id_to_table_index: HashMap<types::ResourceId, TypeResourceTableIndex>,
+    resource_id_to_table_index: HashMap<ResourceId, TypeResourceTableIndex>,
 
     /// A cache of the origin resource type behind a `ResourceId`.
     ///
@@ -121,7 +122,7 @@ pub struct ResourcesBuilder {
     /// phase. This is used to record the actual underlying type of a resource
     /// and where it originally comes from. When a resource is later referred to
     /// then a table is injected to be referred to.
-    resource_id_to_resource_index: HashMap<types::ResourceId, ResourceIndex>,
+    resource_id_to_resource_index: HashMap<ResourceId, ResourceIndex>,
 
     /// The current instance index that's being visited. This is updated as
     /// inliner frames are processed and components are instantiated.
@@ -144,7 +145,7 @@ impl ResourcesBuilder {
     /// any component it's assigned a new table, which is exactly what we want.
     pub fn convert(
         &mut self,
-        id: types::ResourceId,
+        id: ResourceId,
         types: &mut ComponentTypes,
     ) -> TypeResourceTableIndex {
         *self
@@ -174,8 +175,8 @@ impl ResourcesBuilder {
     /// resource type is expected.
     pub fn register_component_entity_type<'a>(
         &mut self,
-        types: &'a types::TypesRef<'_>,
-        ty: types::ComponentEntityType,
+        types: &'a TypesRef<'_>,
+        ty: ComponentEntityType,
         path: &mut Vec<&'a str>,
         register: &mut dyn FnMut(&[&'a str]) -> ResourceIndex,
     ) {
@@ -185,8 +186,8 @@ impl ResourcesBuilder {
             // with the current path and that's inserted in to
             // `resource_id_to_resource_index` if the resource hasn't been seen
             // yet.
-            types::ComponentEntityType::Type {
-                created: types::ComponentAnyTypeId::Resource(id),
+            ComponentEntityType::Type {
+                created: ComponentAnyTypeId::Resource(id),
                 ..
             } => {
                 self.resource_id_to_resource_index
@@ -197,7 +198,7 @@ impl ResourcesBuilder {
             // Resources can be imported/defined through exports of instances so
             // all instance exports are walked here. Note the management of
             // `path` which is used for the recursive invocation of this method.
-            types::ComponentEntityType::Instance(id) => {
+            ComponentEntityType::Instance(id) => {
                 let ty = &types[id];
                 for (name, ty) in ty.exports.iter() {
                     path.push(name);
@@ -208,11 +209,11 @@ impl ResourcesBuilder {
 
             // None of these items can introduce a new component type, so
             // there's no need to recurse over these.
-            types::ComponentEntityType::Func(_)
-            | types::ComponentEntityType::Type { .. }
-            | types::ComponentEntityType::Module(_)
-            | types::ComponentEntityType::Component(_)
-            | types::ComponentEntityType::Value(_) => {}
+            ComponentEntityType::Func(_)
+            | ComponentEntityType::Type { .. }
+            | ComponentEntityType::Module(_)
+            | ComponentEntityType::Component(_)
+            | ComponentEntityType::Value(_) => {}
         }
     }
 
@@ -220,7 +221,7 @@ impl ResourcesBuilder {
     /// defined by the `ty` provided.
     ///
     /// This is used when a local resource is defined within a component for example.
-    pub fn register_resource(&mut self, id: types::ResourceId, ty: ResourceIndex) {
+    pub fn register_resource(&mut self, id: ResourceId, ty: ResourceIndex) {
         let prev = self.resource_id_to_resource_index.insert(id, ty);
         assert!(prev.is_none());
     }
diff --git a/crates/wasi-preview1-component-adapter/verify/src/main.rs b/crates/wasi-preview1-component-adapter/verify/src/main.rs
index d013fe1fb..f074b61f0 100644
--- a/crates/wasi-preview1-component-adapter/verify/src/main.rs
+++ b/crates/wasi-preview1-component-adapter/verify/src/main.rs
@@ -56,29 +56,9 @@ fn main() -> Result<()> {
 
             // sections that shouldn't appear in the specially-crafted core wasm
             // adapter self we're processing
-            Payload::DataCountSection { .. }
-            | Payload::ElementSection(_)
-            | Payload::DataSection(_)
-            | Payload::StartSection { .. }
-            | Payload::TagSection(_)
-            | Payload::UnknownSection { .. } => {
+            _ => {
                 bail!("unsupported section {payload:?} found in preview1.wasm")
             }
-
-            // component-model related things that shouldn't show up
-            Payload::ModuleSection { .. }
-            | Payload::ComponentSection { .. }
-            | Payload::InstanceSection(_)
-            | Payload::ComponentInstanceSection(_)
-            | Payload::ComponentAliasSection(_)
-            | Payload::ComponentCanonicalSection(_)
-            | Payload::ComponentStartSection { .. }
-            | Payload::ComponentImportSection(_)
-            | Payload::CoreTypeSection(_)
-            | Payload::ComponentExportSection(_)
-            | Payload::ComponentTypeSection(_) => {
-                bail!("component section found in preview1.wasm")
-            }
         }
     }
 
diff --git a/crates/wasmtime/src/engine/serialization.rs b/crates/wasmtime/src/engine/serialization.rs
index d530c6d28..885acbcde 100644
--- a/crates/wasmtime/src/engine/serialization.rs
+++ b/crates/wasmtime/src/engine/serialization.rs
@@ -205,6 +205,7 @@ struct WasmFeatures {
     component_model_more_flags: bool,
     component_model_multiple_returns: bool,
     gc_types: bool,
+    wide_arithmetic: bool,
 }
 
 impl Metadata<'_> {
@@ -235,6 +236,7 @@ impl Metadata<'_> {
             legacy_exceptions,
             gc_types,
             stack_switching,
+            wide_arithmetic,
 
             // Always on; we don't currently have knobs for these.
             mutable_global: _,
@@ -277,6 +279,7 @@ impl Metadata<'_> {
                 component_model_more_flags,
                 component_model_multiple_returns,
                 gc_types,
+                wide_arithmetic,
             },
         }
     }
@@ -488,6 +491,7 @@ impl Metadata<'_> {
             component_model_more_flags,
             component_model_multiple_returns,
             gc_types,
+            wide_arithmetic,
         } = self.features;
 
         use wasmparser::WasmFeatures as F;
@@ -579,6 +583,11 @@ impl Metadata<'_> {
             other.contains(F::GC_TYPES),
             "support for WebAssembly gc types",
         )?;
+        Self::check_bool(
+            wide_arithmetic,
+            other.contains(F::WIDE_ARITHMETIC),
+            "WebAssembly wide-arithmetic support",
+        )?;
 
         Ok(())
     }
diff --git a/supply-chain/imports.lock b/supply-chain/imports.lock
index 6d2a0f320..8204d0246 100644
--- a/supply-chain/imports.lock
+++ b/supply-chain/imports.lock
@@ -1909,6 +1909,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wasm-encoder]]
+version = "0.219.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.wasm-metadata]]
 version = "0.214.0"
 when = "2024-07-16"
@@ -1939,6 +1945,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wasm-metadata]]
+version = "0.219.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.wasmparser]]
 version = "0.214.0"
 when = "2024-07-16"
@@ -1969,6 +1981,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wasmparser]]
+version = "0.219.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.wasmprinter]]
 version = "0.214.0"
 when = "2024-07-16"
@@ -1999,6 +2017,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wasmprinter]]
+version = "0.219.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.wasmtime]]
 version = "23.0.1"
 when = "2024-07-22"
@@ -2449,6 +2473,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wast]]
+version = "219.0.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.wat]]
 version = "1.214.0"
 when = "2024-07-16"
@@ -2479,6 +2509,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wat]]
+version = "1.219.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.wiggle]]
 version = "23.0.1"
 when = "2024-07-22"
@@ -3006,6 +3042,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wit-component]]
+version = "0.219.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.wit-parser]]
 version = "0.214.0"
 when = "2024-07-16"
@@ -3036,6 +3078,12 @@ when = "2024-09-30"
 user-id = 73222
 user-login = "wasmtime-publish"
 
+[[publisher.wit-parser]]
+version = "0.219.0"
+when = "2024-10-08"
+user-id = 73222
+user-login = "wasmtime-publish"
+
 [[publisher.witx]]
 version = "0.9.1"
 when = "2021-06-22"
diff --git a/winch/codegen/src/codegen/env.rs b/winch/codegen/src/codegen/env.rs
index baca13fc1..c7afe0e7f 100644
--- a/winch/codegen/src/codegen/env.rs
+++ b/winch/codegen/src/codegen/env.rs
@@ -334,6 +334,7 @@ impl<'a, 'translation, 'data, P: PtrSize> FuncEnv<'a, 'translation, 'data, P> {
         match callee {
             Callee::Local(idx) | Callee::Import(idx) => {
                 let types = self.translation.get_types();
+                let types = types.as_ref();
                 let ty = types[types.core_function_at(idx.as_u32())].unwrap_func();
                 let val = || {
                     let converter = TypeConverter::new(self.translation, self.types);


Test patch:
diff --git a/cranelift/filetests/filetests/isa/x64/i128.clif b/cranelift/filetests/filetests/isa/x64/i128.clif
index 355e0df93..a00be827f 100644
--- a/cranelift/filetests/filetests/isa/x64/i128.clif
+++ b/cranelift/filetests/filetests/isa/x64/i128.clif
@@ -2141,3 +2141,42 @@ block0(v0: i64, v1: i64):
 ;   popq %rbp
 ;   retq
 
+function %select128(i128, i128) -> i32 {
+block0(v0: i128, v1: i128):
+    v2 = icmp ult v0, v1
+    v3 = iconst.i32 100
+    v4 = iconst.i32 200
+    v5 = select v2, v3, v4
+    return v5
+}
+
+; VCode:
+;   pushq   %rbp
+;   movq    %rsp, %rbp
+; block0:
+;   movl    $200, %eax
+;   cmpq    %rdx, %rdi
+;   sbbq    %rsi, %rcx, %rsi
+;   cmovbl  const(0), %eax, %eax
+;   movq    %rbp, %rsp
+;   popq    %rbp
+;   ret
+;
+; Disassembled:
+; block0: ; offset 0x0
+;   pushq %rbp
+;   movq %rsp, %rbp
+; block1: ; offset 0x4
+;   movl $0xc8, %eax
+;   cmpq %rdx, %rdi
+;   sbbq %rcx, %rsi
+;   cmovbl 0xa(%rip), %eax
+;   movq %rbp, %rsp
+;   popq %rbp
+;   retq
+;   addb %al, (%rax)
+;   addb %al, (%rax)
+;   addb %ah, (%rax, %rax)
+;   addb %al, (%rax)
+;   addb %al, (%rax)
+