* [PULL 2/4] rust/pl011: merge device_class.rs into device.rs
2025-07-25 12:53 [PULL 0/4] Rust, target/i386 patches for 10.1-rc1 Paolo Bonzini
2025-07-25 12:54 ` [PULL 1/4] rust: devices are not staticlibs Paolo Bonzini
@ 2025-07-25 12:54 ` Paolo Bonzini
2025-07-25 12:54 ` [PULL 3/4] scripts: add script to help distros use global Rust packages Paolo Bonzini
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2025-07-25 12:54 UTC (permalink / raw)
To: qemu-devel; +Cc: Manos Pitsidianakis
From: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
The split was a relic of early development and is not necessary.
Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
Link: https://lore.kernel.org/r/20250718-rust-pl011-cleanup-v1-1-c71b1d6a69a5@linaro.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
rust/hw/char/pl011/src/device.rs | 103 +++++++++++++++++++++++--
rust/hw/char/pl011/src/device_class.rs | 103 -------------------------
rust/hw/char/pl011/src/lib.rs | 1 -
3 files changed, 96 insertions(+), 111 deletions(-)
delete mode 100644 rust/hw/char/pl011/src/device_class.rs
diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/device.rs
index 5b53f2649f1..ceb71dd99b6 100644
--- a/rust/hw/char/pl011/src/device.rs
+++ b/rust/hw/char/pl011/src/device.rs
@@ -2,9 +2,14 @@
// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
// SPDX-License-Identifier: GPL-2.0-or-later
-use std::{ffi::CStr, mem::size_of};
+use std::{
+ ffi::{c_int, c_void, CStr},
+ mem::size_of,
+ ptr::NonNull,
+};
use qemu_api::{
+ bindings::{qdev_prop_bool, qdev_prop_chr},
chardev::{CharBackend, Chardev, Event},
impl_vmstate_forward,
irq::{IRQState, InterruptSource},
@@ -18,12 +23,11 @@
sysbus::{SysBusDevice, SysBusDeviceImpl},
uninit_field_mut,
vmstate::VMStateDescription,
+ vmstate_clock, vmstate_fields, vmstate_of, vmstate_struct, vmstate_subsections, vmstate_unused,
+ zeroable::Zeroable,
};
-use crate::{
- device_class,
- registers::{self, Interrupt, RegisterOffset},
-};
+use crate::registers::{self, Interrupt, RegisterOffset};
// TODO: You must disable the UART before any of the control registers are
// reprogrammed. When the UART is disabled in the middle of transmission or
@@ -173,10 +177,10 @@ impl ObjectImpl for PL011State {
impl DeviceImpl for PL011State {
fn properties() -> &'static [Property] {
- &device_class::PL011_PROPERTIES
+ &PL011_PROPERTIES
}
fn vmsd() -> Option<&'static VMStateDescription> {
- Some(&device_class::VMSTATE_PL011)
+ Some(&VMSTATE_PL011)
}
const REALIZE: Option<fn(&Self) -> qemu_api::Result<()>> = Some(Self::realize);
}
@@ -712,3 +716,88 @@ impl PL011Impl for PL011Luminary {
impl DeviceImpl for PL011Luminary {}
impl ResettablePhasesImpl for PL011Luminary {}
impl SysBusDeviceImpl for PL011Luminary {}
+
+extern "C" fn pl011_clock_needed(opaque: *mut c_void) -> bool {
+ let state = NonNull::new(opaque).unwrap().cast::<PL011State>();
+ unsafe { state.as_ref().migrate_clock }
+}
+
+/// Migration subsection for [`PL011State`] clock.
+static VMSTATE_PL011_CLOCK: VMStateDescription = VMStateDescription {
+ name: c"pl011/clock".as_ptr(),
+ version_id: 1,
+ minimum_version_id: 1,
+ needed: Some(pl011_clock_needed),
+ fields: vmstate_fields! {
+ vmstate_clock!(PL011State, clock),
+ },
+ ..Zeroable::ZERO
+};
+
+extern "C" fn pl011_post_load(opaque: *mut c_void, version_id: c_int) -> c_int {
+ let state = NonNull::new(opaque).unwrap().cast::<PL011State>();
+ let result = unsafe { state.as_ref().post_load(version_id as u32) };
+ if result.is_err() {
+ -1
+ } else {
+ 0
+ }
+}
+
+static VMSTATE_PL011_REGS: VMStateDescription = VMStateDescription {
+ name: c"pl011/regs".as_ptr(),
+ version_id: 2,
+ minimum_version_id: 2,
+ fields: vmstate_fields! {
+ vmstate_of!(PL011Registers, flags),
+ vmstate_of!(PL011Registers, line_control),
+ vmstate_of!(PL011Registers, receive_status_error_clear),
+ vmstate_of!(PL011Registers, control),
+ vmstate_of!(PL011Registers, dmacr),
+ vmstate_of!(PL011Registers, int_enabled),
+ vmstate_of!(PL011Registers, int_level),
+ vmstate_of!(PL011Registers, read_fifo),
+ vmstate_of!(PL011Registers, ilpr),
+ vmstate_of!(PL011Registers, ibrd),
+ vmstate_of!(PL011Registers, fbrd),
+ vmstate_of!(PL011Registers, ifl),
+ vmstate_of!(PL011Registers, read_pos),
+ vmstate_of!(PL011Registers, read_count),
+ vmstate_of!(PL011Registers, read_trigger),
+ },
+ ..Zeroable::ZERO
+};
+
+pub static VMSTATE_PL011: VMStateDescription = VMStateDescription {
+ name: c"pl011".as_ptr(),
+ version_id: 2,
+ minimum_version_id: 2,
+ post_load: Some(pl011_post_load),
+ fields: vmstate_fields! {
+ vmstate_unused!(core::mem::size_of::<u32>()),
+ vmstate_struct!(PL011State, regs, &VMSTATE_PL011_REGS, BqlRefCell<PL011Registers>),
+ },
+ subsections: vmstate_subsections! {
+ VMSTATE_PL011_CLOCK
+ },
+ ..Zeroable::ZERO
+};
+
+qemu_api::declare_properties! {
+ PL011_PROPERTIES,
+ qemu_api::define_property!(
+ c"chardev",
+ PL011State,
+ char_backend,
+ unsafe { &qdev_prop_chr },
+ CharBackend
+ ),
+ qemu_api::define_property!(
+ c"migrate-clk",
+ PL011State,
+ migrate_clock,
+ unsafe { &qdev_prop_bool },
+ bool,
+ default = true
+ ),
+}
diff --git a/rust/hw/char/pl011/src/device_class.rs b/rust/hw/char/pl011/src/device_class.rs
deleted file mode 100644
index d328d846323..00000000000
--- a/rust/hw/char/pl011/src/device_class.rs
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2024, Linaro Limited
-// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-use std::{
- ffi::{c_int, c_void},
- ptr::NonNull,
-};
-
-use qemu_api::{
- bindings::{qdev_prop_bool, qdev_prop_chr},
- prelude::*,
- vmstate::VMStateDescription,
- vmstate_clock, vmstate_fields, vmstate_of, vmstate_struct, vmstate_subsections, vmstate_unused,
- zeroable::Zeroable,
-};
-
-use crate::device::{PL011Registers, PL011State};
-
-extern "C" fn pl011_clock_needed(opaque: *mut c_void) -> bool {
- let state = NonNull::new(opaque).unwrap().cast::<PL011State>();
- unsafe { state.as_ref().migrate_clock }
-}
-
-/// Migration subsection for [`PL011State`] clock.
-static VMSTATE_PL011_CLOCK: VMStateDescription = VMStateDescription {
- name: c"pl011/clock".as_ptr(),
- version_id: 1,
- minimum_version_id: 1,
- needed: Some(pl011_clock_needed),
- fields: vmstate_fields! {
- vmstate_clock!(PL011State, clock),
- },
- ..Zeroable::ZERO
-};
-
-extern "C" fn pl011_post_load(opaque: *mut c_void, version_id: c_int) -> c_int {
- let state = NonNull::new(opaque).unwrap().cast::<PL011State>();
- let result = unsafe { state.as_ref().post_load(version_id as u32) };
- if result.is_err() {
- -1
- } else {
- 0
- }
-}
-
-static VMSTATE_PL011_REGS: VMStateDescription = VMStateDescription {
- name: c"pl011/regs".as_ptr(),
- version_id: 2,
- minimum_version_id: 2,
- fields: vmstate_fields! {
- vmstate_of!(PL011Registers, flags),
- vmstate_of!(PL011Registers, line_control),
- vmstate_of!(PL011Registers, receive_status_error_clear),
- vmstate_of!(PL011Registers, control),
- vmstate_of!(PL011Registers, dmacr),
- vmstate_of!(PL011Registers, int_enabled),
- vmstate_of!(PL011Registers, int_level),
- vmstate_of!(PL011Registers, read_fifo),
- vmstate_of!(PL011Registers, ilpr),
- vmstate_of!(PL011Registers, ibrd),
- vmstate_of!(PL011Registers, fbrd),
- vmstate_of!(PL011Registers, ifl),
- vmstate_of!(PL011Registers, read_pos),
- vmstate_of!(PL011Registers, read_count),
- vmstate_of!(PL011Registers, read_trigger),
- },
- ..Zeroable::ZERO
-};
-
-pub static VMSTATE_PL011: VMStateDescription = VMStateDescription {
- name: c"pl011".as_ptr(),
- version_id: 2,
- minimum_version_id: 2,
- post_load: Some(pl011_post_load),
- fields: vmstate_fields! {
- vmstate_unused!(core::mem::size_of::<u32>()),
- vmstate_struct!(PL011State, regs, &VMSTATE_PL011_REGS, BqlRefCell<PL011Registers>),
- },
- subsections: vmstate_subsections! {
- VMSTATE_PL011_CLOCK
- },
- ..Zeroable::ZERO
-};
-
-qemu_api::declare_properties! {
- PL011_PROPERTIES,
- qemu_api::define_property!(
- c"chardev",
- PL011State,
- char_backend,
- unsafe { &qdev_prop_chr },
- CharBackend
- ),
- qemu_api::define_property!(
- c"migrate-clk",
- PL011State,
- migrate_clock,
- unsafe { &qdev_prop_bool },
- bool,
- default = true
- ),
-}
diff --git a/rust/hw/char/pl011/src/lib.rs b/rust/hw/char/pl011/src/lib.rs
index 5c4fbc9d148..2b70d2ff560 100644
--- a/rust/hw/char/pl011/src/lib.rs
+++ b/rust/hw/char/pl011/src/lib.rs
@@ -13,7 +13,6 @@
//! the [`registers`] module for register types.
mod device;
-mod device_class;
mod registers;
pub use device::pl011_create;
--
2.50.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PULL 3/4] scripts: add script to help distros use global Rust packages
2025-07-25 12:53 [PULL 0/4] Rust, target/i386 patches for 10.1-rc1 Paolo Bonzini
2025-07-25 12:54 ` [PULL 1/4] rust: devices are not staticlibs Paolo Bonzini
2025-07-25 12:54 ` [PULL 2/4] rust/pl011: merge device_class.rs into device.rs Paolo Bonzini
@ 2025-07-25 12:54 ` Paolo Bonzini
2025-07-25 12:54 ` [PULL 4/4] target/i386: fix width of third operand of VINSERTx128 Paolo Bonzini
2025-07-28 13:30 ` [PULL 0/4] Rust, target/i386 patches for 10.1-rc1 Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2025-07-25 12:54 UTC (permalink / raw)
To: qemu-devel; +Cc: Neal Gompa
Some distros prefer to avoid vendored crate sources, and instead use
local sources from e.g. ``/usr/share/cargo/registry``. Add a
script, inspired by the Mesa spec file(*), that automatically
performs this task. The script is meant to be invoked after unpacking
the QEMU tarball.
(*) This is the hack that Mesa uses:
export MESON_PACKAGE_CACHE_DIR="%{cargo_registry}/"
%define inst_crate_nameversion() %(basename %{cargo_registry}/%{1}-*)
%define rewrite_wrap_file() sed -e "/source.*/d" -e "s/%{1}-.*/%{inst_crate_nameversion %{1}}/" -i subprojects/%{1}.wrap
%rewrite_wrap_file proc-macro2
... more %rewrite_wrap_file invocations follow ...
Reviewed-by: Neal Gompa <ngompa@fedoraproject.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
MAINTAINERS | 1 +
docs/about/build-platforms.rst | 8 +
scripts/get-wraps-from-cargo-registry.py | 190 +++++++++++++++++++++++
3 files changed, 199 insertions(+)
create mode 100755 scripts/get-wraps-from-cargo-registry.py
diff --git a/MAINTAINERS b/MAINTAINERS
index a4623456183..1604f3dfc1f 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3511,6 +3511,7 @@ S: Maintained
F: rust/qemu-api
F: rust/qemu-api-macros
F: rust/rustfmt.toml
+F: scripts/get-wraps-from-cargo-registry.py
Rust-related patches CC here
L: qemu-rust@nongnu.org
diff --git a/docs/about/build-platforms.rst b/docs/about/build-platforms.rst
index 8ecbd6b26f7..8671c3be9cd 100644
--- a/docs/about/build-platforms.rst
+++ b/docs/about/build-platforms.rst
@@ -127,6 +127,14 @@ Rust build dependencies
(or newer) package. The path to ``rustc`` and ``rustdoc`` must be
provided manually to the configure script.
+ Some distros prefer to avoid vendored crate sources, and instead use
+ local sources from e.g. ``/usr/share/cargo/registry``. QEMU includes a
+ script, ``scripts/get-wraps-from-cargo-registry.py``, that automatically
+ performs this task. The script is meant to be invoked after unpacking
+ the QEMU tarball. QEMU also includes ``rust/Cargo.toml`` and
+ ``rust/Cargo.lock`` files that can be used to compute QEMU's build
+ dependencies, e.g. using ``cargo2rpm -p rust/Cargo.toml buildrequires``.
+
Optional build dependencies
Build components whose absence does not affect the ability to build QEMU
may not be available in distros, or may be too old for our requirements.
diff --git a/scripts/get-wraps-from-cargo-registry.py b/scripts/get-wraps-from-cargo-registry.py
new file mode 100755
index 00000000000..31eed5c2dd4
--- /dev/null
+++ b/scripts/get-wraps-from-cargo-registry.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python3
+
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+"""
+get-wraps-from-cargo-registry.py - Update Meson subprojects from a global registry
+"""
+
+# Copyright (C) 2025 Red Hat, Inc.
+#
+# Author: Paolo Bonzini <pbonzini@redhat.com>
+
+import argparse
+import configparser
+import filecmp
+import glob
+import os
+import subprocess
+import sys
+
+
+def get_name_and_semver(namever: str) -> tuple[str, str]:
+ """Split a subproject name into its name and semantic version parts"""
+ parts = namever.rsplit("-", 1)
+ if len(parts) != 2:
+ return namever, ""
+
+ return parts[0], parts[1]
+
+
+class UpdateSubprojects:
+ cargo_registry: str
+ top_srcdir: str
+ dry_run: bool
+ changes: int = 0
+
+ def find_installed_crate(self, namever: str) -> str | None:
+ """Find installed crate matching name and semver prefix"""
+ name, semver = get_name_and_semver(namever)
+
+ # exact version match
+ path = os.path.join(self.cargo_registry, f"{name}-{semver}")
+ if os.path.exists(path):
+ return f"{name}-{semver}"
+
+ # semver match
+ matches = sorted(glob.glob(f"{path}.*"))
+ return os.path.basename(matches[0]) if matches else None
+
+ def compare_build_rs(self, orig_dir: str, registry_namever: str) -> None:
+ """Warn if the build.rs in the original directory differs from the registry version."""
+ orig_build_rs = os.path.join(orig_dir, "build.rs")
+ new_build_rs = os.path.join(self.cargo_registry, registry_namever, "build.rs")
+
+ msg = None
+ if os.path.isfile(orig_build_rs) != os.path.isfile(new_build_rs):
+ if os.path.isfile(orig_build_rs):
+ msg = f"build.rs removed in {registry_namever}"
+ if os.path.isfile(new_build_rs):
+ msg = f"build.rs added in {registry_namever}"
+
+ elif os.path.isfile(orig_build_rs) and not filecmp.cmp(orig_build_rs, new_build_rs):
+ msg = f"build.rs changed from {orig_dir} to {registry_namever}"
+
+ if msg:
+ print(f"⚠️ Warning: {msg}")
+ print(" This may affect the build process - please review the differences.")
+
+ def update_subproject(self, wrap_file: str, registry_namever: str) -> None:
+ """Modify [wrap-file] section to point to self.cargo_registry."""
+ assert wrap_file.endswith("-rs.wrap")
+ wrap_name = wrap_file[:-5]
+
+ env = os.environ.copy()
+ env["MESON_PACKAGE_CACHE_DIR"] = self.cargo_registry
+
+ config = configparser.ConfigParser()
+ config.read(wrap_file)
+ if "wrap-file" not in config:
+ return
+
+ # do not download the wrap, always use the local copy
+ orig_dir = config["wrap-file"]["directory"]
+ if os.path.exists(orig_dir) and orig_dir != registry_namever:
+ self.compare_build_rs(orig_dir, registry_namever)
+
+ if self.dry_run:
+ if orig_dir == registry_namever:
+ print(f"Will install {orig_dir} from registry.")
+ else:
+ print(f"Will replace {orig_dir} with {registry_namever}.")
+ self.changes += 1
+ return
+
+ config["wrap-file"]["directory"] = registry_namever
+ for key in list(config["wrap-file"].keys()):
+ if key.startswith("source"):
+ del config["wrap-file"][key]
+
+ # replace existing directory with installed version
+ if os.path.exists(orig_dir):
+ subprocess.run(
+ ["meson", "subprojects", "purge", "--confirm", wrap_name],
+ cwd=self.top_srcdir,
+ env=env,
+ check=True,
+ )
+
+ with open(wrap_file, "w") as f:
+ config.write(f)
+
+ if orig_dir == registry_namever:
+ print(f"Installing {orig_dir} from registry.")
+ else:
+ print(f"Replacing {orig_dir} with {registry_namever}.")
+ patch_dir = config["wrap-file"]["patch_directory"]
+ patch_dir = os.path.join("packagefiles", patch_dir)
+ _, ver = registry_namever.rsplit("-", 1)
+ subprocess.run(
+ ["meson", "rewrite", "kwargs", "set", "project", "/", "version", ver],
+ cwd=patch_dir,
+ env=env,
+ check=True,
+ )
+
+ subprocess.run(
+ ["meson", "subprojects", "download", wrap_name],
+ cwd=self.top_srcdir,
+ env=env,
+ check=True,
+ )
+ self.changes += 1
+
+ @staticmethod
+ def parse_cmdline() -> argparse.Namespace:
+ parser = argparse.ArgumentParser(
+ description="Replace Meson subprojects with packages in a Cargo registry"
+ )
+ parser.add_argument(
+ "--cargo-registry",
+ default=os.environ.get("CARGO_REGISTRY"),
+ help="Path to Cargo registry (default: CARGO_REGISTRY env var)",
+ )
+ parser.add_argument(
+ "--dry-run",
+ action="store_true",
+ default=False,
+ help="Do not actually replace anything",
+ )
+
+ args = parser.parse_args()
+ if not args.cargo_registry:
+ print("error: CARGO_REGISTRY environment variable not set and --cargo-registry not provided")
+ sys.exit(1)
+
+ return args
+
+ def __init__(self, args: argparse.Namespace):
+ self.cargo_registry = args.cargo_registry
+ self.dry_run = args.dry_run
+ self.top_srcdir = os.getcwd()
+
+ def main(self) -> None:
+ if not os.path.exists("subprojects"):
+ print("'subprojects' directory not found, nothing to do.")
+ return
+
+ os.chdir("subprojects")
+ for wrap_file in sorted(glob.glob("*-rs.wrap")):
+ namever = wrap_file[:-8] # Remove '-rs.wrap'
+
+ registry_namever = self.find_installed_crate(namever)
+ if not registry_namever:
+ print(f"No installed crate found for {wrap_file}")
+ continue
+
+ self.update_subproject(wrap_file, registry_namever)
+
+ if self.changes:
+ if self.dry_run:
+ print("Rerun without --dry-run to apply changes.")
+ else:
+ print(f"✨ {self.changes} subproject(s) updated!")
+ else:
+ print("No changes.")
+
+
+if __name__ == "__main__":
+ args = UpdateSubprojects.parse_cmdline()
+ UpdateSubprojects(args).main()
--
2.50.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PULL 4/4] target/i386: fix width of third operand of VINSERTx128
2025-07-25 12:53 [PULL 0/4] Rust, target/i386 patches for 10.1-rc1 Paolo Bonzini
` (2 preceding siblings ...)
2025-07-25 12:54 ` [PULL 3/4] scripts: add script to help distros use global Rust packages Paolo Bonzini
@ 2025-07-25 12:54 ` Paolo Bonzini
2025-07-28 13:30 ` [PULL 0/4] Rust, target/i386 patches for 10.1-rc1 Stefan Hajnoczi
4 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2025-07-25 12:54 UTC (permalink / raw)
To: qemu-devel
Cc: Eric Biggers, Ard Biesheuvel, Jason A. Donenfeld, Guenter Roeck,
qemu-stable
Table A-5 of the Intel manual incorrectly lists the third operand of
VINSERTx128 as Wqq, but it is actually a 128-bit value. This is
visible when W is a memory operand close to the end of the page.
Fixes the recently-added poly1305_kunit test in linux-next.
(No testcase yet, but I plan to modify test-avx2 to use memory
close to the end of the page. This would work because the test
vectors correctly have the memory operand as xmm2/m128).
Reported-by: Eric Biggers <ebiggers@kernel.org>
Tested-by: Eric Biggers <ebiggers@kernel.org>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: qemu-stable@nongnu.org
Fixes: 79068477686 ("target/i386: reimplement 0x0f 0x3a, add AVX", 2022-10-18)
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target/i386/tcg/decode-new.c.inc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.c.inc
index 853b1c8bf95..51038657f0f 100644
--- a/target/i386/tcg/decode-new.c.inc
+++ b/target/i386/tcg/decode-new.c.inc
@@ -878,10 +878,10 @@ static const X86OpEntry opcodes_0F3A[256] = {
[0x0e] = X86_OP_ENTRY4(VPBLENDW, V,x, H,x, W,x, vex4 cpuid(SSE41) avx2_256 p_66),
[0x0f] = X86_OP_ENTRY4(PALIGNR, V,x, H,x, W,x, vex4 cpuid(SSSE3) mmx avx2_256 p_00_66),
- [0x18] = X86_OP_ENTRY4(VINSERTx128, V,qq, H,qq, W,qq, vex6 chk(W0) cpuid(AVX) p_66),
+ [0x18] = X86_OP_ENTRY4(VINSERTx128, V,qq, H,qq, W,dq, vex6 chk(W0) cpuid(AVX) p_66),
[0x19] = X86_OP_ENTRY3(VEXTRACTx128, W,dq, V,qq, I,b, vex6 chk(W0) cpuid(AVX) p_66),
- [0x38] = X86_OP_ENTRY4(VINSERTx128, V,qq, H,qq, W,qq, vex6 chk(W0) cpuid(AVX2) p_66),
+ [0x38] = X86_OP_ENTRY4(VINSERTx128, V,qq, H,qq, W,dq, vex6 chk(W0) cpuid(AVX2) p_66),
[0x39] = X86_OP_ENTRY3(VEXTRACTx128, W,dq, V,qq, I,b, vex6 chk(W0) cpuid(AVX2) p_66),
/* Listed incorrectly as type 4 */
--
2.50.1
^ permalink raw reply related [flat|nested] 6+ messages in thread