use crate::iced_constants::IcedConstants;
use crate::iced_error::IcedError;
use core::iter::{ExactSizeIterator, FusedIterator, Iterator};
use core::{fmt, mem};
#[cfg(any(feature = "instr_info", feature = "encoder"))]
pub use crate::memory_size::info::*;
#[cfg(any(feature = "instr_info", feature = "encoder"))]
mod info {
use crate::iced_constants::IcedConstants;
use crate::MemorySize;
#[rustfmt::skip]
pub(super) static MEMORY_SIZE_INFOS: &[MemorySizeInfo; IcedConstants::MEMORY_SIZE_ENUM_COUNT] = &[
MemorySizeInfo { size: 0, element_size: 0, memory_size: MemorySize::Unknown, element_type: MemorySize::Unknown, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 1, element_size: 1, memory_size: MemorySize::UInt8, element_type: MemorySize::UInt8, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::UInt52, element_type: MemorySize::UInt52, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::UInt64, element_type: MemorySize::UInt64, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 16, memory_size: MemorySize::UInt128, element_type: MemorySize::UInt128, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 32, memory_size: MemorySize::UInt256, element_type: MemorySize::UInt256, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 64, memory_size: MemorySize::UInt512, element_type: MemorySize::UInt512, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 1, element_size: 1, memory_size: MemorySize::Int8, element_type: MemorySize::Int8, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Int16, element_type: MemorySize::Int16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Int64, element_type: MemorySize::Int64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 16, memory_size: MemorySize::Int128, element_type: MemorySize::Int128, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 32, memory_size: MemorySize::Int256, element_type: MemorySize::Int256, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 64, memory_size: MemorySize::Int512, element_type: MemorySize::Int512, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::SegPtr16, element_type: MemorySize::SegPtr16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 6, element_size: 6, memory_size: MemorySize::SegPtr32, element_type: MemorySize::SegPtr32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 10, element_size: 10, memory_size: MemorySize::SegPtr64, element_type: MemorySize::SegPtr64, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::WordOffset, element_type: MemorySize::WordOffset, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::DwordOffset, element_type: MemorySize::DwordOffset, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::QwordOffset, element_type: MemorySize::QwordOffset, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 2, memory_size: MemorySize::Bound16_WordWord, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 4, memory_size: MemorySize::Bound32_DwordDword, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Bnd32, element_type: MemorySize::Bnd32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 16, memory_size: MemorySize::Bnd64, element_type: MemorySize::Bnd64, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 6, element_size: 6, memory_size: MemorySize::Fword6, element_type: MemorySize::Fword6, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 10, element_size: 10, memory_size: MemorySize::Fword10, element_type: MemorySize::Fword10, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Float64, element_type: MemorySize::Float64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 10, element_size: 10, memory_size: MemorySize::Float80, element_type: MemorySize::Float80, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 16, memory_size: MemorySize::Float128, element_type: MemorySize::Float128, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::BFloat16, element_type: MemorySize::BFloat16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 14, element_size: 14, memory_size: MemorySize::FpuEnv14, element_type: MemorySize::FpuEnv14, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 28, element_size: 28, memory_size: MemorySize::FpuEnv28, element_type: MemorySize::FpuEnv28, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 94, element_size: 94, memory_size: MemorySize::FpuState94, element_type: MemorySize::FpuState94, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 108, element_size: 108, memory_size: MemorySize::FpuState108, element_type: MemorySize::FpuState108, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 512, element_size: 512, memory_size: MemorySize::Fxsave_512Byte, element_type: MemorySize::Fxsave_512Byte, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 512, element_size: 512, memory_size: MemorySize::Fxsave64_512Byte, element_type: MemorySize::Fxsave64_512Byte, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 0, element_size: 0, memory_size: MemorySize::Xsave, element_type: MemorySize::Xsave, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 0, element_size: 0, memory_size: MemorySize::Xsave64, element_type: MemorySize::Xsave64, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 10, element_size: 10, memory_size: MemorySize::Bcd, element_type: MemorySize::Bcd, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 64, memory_size: MemorySize::Tilecfg, element_type: MemorySize::Tilecfg, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 0, element_size: 0, memory_size: MemorySize::Tile, element_type: MemorySize::Tile, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 10, element_size: 10, memory_size: MemorySize::SegmentDescSelector, element_type: MemorySize::SegmentDescSelector, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 48, element_size: 48, memory_size: MemorySize::KLHandleAes128, element_type: MemorySize::KLHandleAes128, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 64, memory_size: MemorySize::KLHandleAes256, element_type: MemorySize::KLHandleAes256, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 1, memory_size: MemorySize::Packed16_UInt8, element_type: MemorySize::UInt8, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 1, memory_size: MemorySize::Packed16_Int8, element_type: MemorySize::Int8, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 1, memory_size: MemorySize::Packed32_UInt8, element_type: MemorySize::UInt8, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 1, memory_size: MemorySize::Packed32_Int8, element_type: MemorySize::Int8, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 2, memory_size: MemorySize::Packed32_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 2, memory_size: MemorySize::Packed32_Int16, element_type: MemorySize::Int16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 2, memory_size: MemorySize::Packed32_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 4, element_size: 2, memory_size: MemorySize::Packed32_BFloat16, element_type: MemorySize::BFloat16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 1, memory_size: MemorySize::Packed64_UInt8, element_type: MemorySize::UInt8, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 1, memory_size: MemorySize::Packed64_Int8, element_type: MemorySize::Int8, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 2, memory_size: MemorySize::Packed64_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 2, memory_size: MemorySize::Packed64_Int16, element_type: MemorySize::Int16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 4, memory_size: MemorySize::Packed64_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 4, memory_size: MemorySize::Packed64_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 2, memory_size: MemorySize::Packed64_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 8, element_size: 4, memory_size: MemorySize::Packed64_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 1, memory_size: MemorySize::Packed128_UInt8, element_type: MemorySize::UInt8, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 1, memory_size: MemorySize::Packed128_Int8, element_type: MemorySize::Int8, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 2, memory_size: MemorySize::Packed128_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 2, memory_size: MemorySize::Packed128_Int16, element_type: MemorySize::Int16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 4, memory_size: MemorySize::Packed128_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 4, memory_size: MemorySize::Packed128_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 8, memory_size: MemorySize::Packed128_UInt52, element_type: MemorySize::UInt52, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 8, memory_size: MemorySize::Packed128_UInt64, element_type: MemorySize::UInt64, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 8, memory_size: MemorySize::Packed128_Int64, element_type: MemorySize::Int64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 2, memory_size: MemorySize::Packed128_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 4, memory_size: MemorySize::Packed128_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 8, memory_size: MemorySize::Packed128_Float64, element_type: MemorySize::Float64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 2, memory_size: MemorySize::Packed128_BFloat16, element_type: MemorySize::BFloat16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 4, memory_size: MemorySize::Packed128_2xFloat16, element_type: MemorySize::Packed32_Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 16, element_size: 4, memory_size: MemorySize::Packed128_2xBFloat16, element_type: MemorySize::Packed32_BFloat16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 1, memory_size: MemorySize::Packed256_UInt8, element_type: MemorySize::UInt8, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 1, memory_size: MemorySize::Packed256_Int8, element_type: MemorySize::Int8, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 2, memory_size: MemorySize::Packed256_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 2, memory_size: MemorySize::Packed256_Int16, element_type: MemorySize::Int16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 4, memory_size: MemorySize::Packed256_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 4, memory_size: MemorySize::Packed256_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 8, memory_size: MemorySize::Packed256_UInt52, element_type: MemorySize::UInt52, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 8, memory_size: MemorySize::Packed256_UInt64, element_type: MemorySize::UInt64, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 8, memory_size: MemorySize::Packed256_Int64, element_type: MemorySize::Int64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 16, memory_size: MemorySize::Packed256_UInt128, element_type: MemorySize::UInt128, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 16, memory_size: MemorySize::Packed256_Int128, element_type: MemorySize::Int128, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 2, memory_size: MemorySize::Packed256_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 4, memory_size: MemorySize::Packed256_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 8, memory_size: MemorySize::Packed256_Float64, element_type: MemorySize::Float64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 16, memory_size: MemorySize::Packed256_Float128, element_type: MemorySize::Float128, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 2, memory_size: MemorySize::Packed256_BFloat16, element_type: MemorySize::BFloat16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 4, memory_size: MemorySize::Packed256_2xFloat16, element_type: MemorySize::Packed32_Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 32, element_size: 4, memory_size: MemorySize::Packed256_2xBFloat16, element_type: MemorySize::Packed32_BFloat16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 1, memory_size: MemorySize::Packed512_UInt8, element_type: MemorySize::UInt8, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 1, memory_size: MemorySize::Packed512_Int8, element_type: MemorySize::Int8, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 2, memory_size: MemorySize::Packed512_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 2, memory_size: MemorySize::Packed512_Int16, element_type: MemorySize::Int16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 4, memory_size: MemorySize::Packed512_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 4, memory_size: MemorySize::Packed512_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 8, memory_size: MemorySize::Packed512_UInt52, element_type: MemorySize::UInt52, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 8, memory_size: MemorySize::Packed512_UInt64, element_type: MemorySize::UInt64, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 8, memory_size: MemorySize::Packed512_Int64, element_type: MemorySize::Int64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 16, memory_size: MemorySize::Packed512_UInt128, element_type: MemorySize::UInt128, is_signed: false, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 2, memory_size: MemorySize::Packed512_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 4, memory_size: MemorySize::Packed512_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 8, memory_size: MemorySize::Packed512_Float64, element_type: MemorySize::Float64, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 4, memory_size: MemorySize::Packed512_2xFloat16, element_type: MemorySize::Packed32_Float16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 64, element_size: 4, memory_size: MemorySize::Packed512_2xBFloat16, element_type: MemorySize::Packed32_BFloat16, is_signed: true, is_broadcast: false },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast32_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast64_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast64_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast64_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast64_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast128_Int16, element_type: MemorySize::Int16, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast128_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast128_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast128_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast128_UInt52, element_type: MemorySize::UInt52, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast128_UInt64, element_type: MemorySize::UInt64, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast128_Int64, element_type: MemorySize::Int64, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast128_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast128_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast128_Float64, element_type: MemorySize::Float64, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast128_2xInt16, element_type: MemorySize::Packed32_Int16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast128_2xInt32, element_type: MemorySize::Packed64_Int32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast128_2xUInt32, element_type: MemorySize::Packed64_UInt32, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast128_2xFloat16, element_type: MemorySize::Packed32_Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast128_2xBFloat16, element_type: MemorySize::Packed32_BFloat16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast256_Int16, element_type: MemorySize::Int16, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast256_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast256_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast256_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast256_UInt52, element_type: MemorySize::UInt52, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast256_UInt64, element_type: MemorySize::UInt64, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast256_Int64, element_type: MemorySize::Int64, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast256_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast256_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast256_Float64, element_type: MemorySize::Float64, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast256_2xInt16, element_type: MemorySize::Packed32_Int16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast256_2xInt32, element_type: MemorySize::Packed64_Int32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast256_2xUInt32, element_type: MemorySize::Packed64_UInt32, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast256_2xFloat16, element_type: MemorySize::Packed32_Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast256_2xBFloat16, element_type: MemorySize::Packed32_BFloat16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast512_Int16, element_type: MemorySize::Int16, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast512_UInt16, element_type: MemorySize::UInt16, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast512_UInt32, element_type: MemorySize::UInt32, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast512_Int32, element_type: MemorySize::Int32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast512_UInt52, element_type: MemorySize::UInt52, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast512_UInt64, element_type: MemorySize::UInt64, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast512_Int64, element_type: MemorySize::Int64, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 2, element_size: 2, memory_size: MemorySize::Broadcast512_Float16, element_type: MemorySize::Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast512_Float32, element_type: MemorySize::Float32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast512_Float64, element_type: MemorySize::Float64, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast512_2xFloat16, element_type: MemorySize::Packed32_Float16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast512_2xInt16, element_type: MemorySize::Packed32_Int16, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast512_2xUInt32, element_type: MemorySize::Packed64_UInt32, is_signed: false, is_broadcast: true },
MemorySizeInfo { size: 8, element_size: 8, memory_size: MemorySize::Broadcast512_2xInt32, element_type: MemorySize::Packed64_Int32, is_signed: true, is_broadcast: true },
MemorySizeInfo { size: 4, element_size: 4, memory_size: MemorySize::Broadcast512_2xBFloat16, element_type: MemorySize::Packed32_BFloat16, is_signed: true, is_broadcast: true },
];
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct MemorySizeInfo {
size: u16,
element_size: u16,
memory_size: MemorySize,
element_type: MemorySize,
is_signed: bool,
is_broadcast: bool,
}
impl MemorySizeInfo {
#[must_use]
#[inline]
pub const fn memory_size(&self) -> MemorySize {
self.memory_size
}
#[must_use]
#[inline]
pub const fn size(&self) -> usize {
self.size as usize
}
#[must_use]
#[inline]
pub const fn element_size(&self) -> usize {
self.element_size as usize
}
#[must_use]
#[inline]
pub const fn element_type(&self) -> MemorySize {
self.element_type
}
#[must_use]
#[inline]
pub fn element_type_info(&self) -> &'static Self {
self.element_type().info()
}
#[must_use]
#[inline]
pub const fn is_signed(&self) -> bool {
self.is_signed
}
#[must_use]
#[inline]
pub const fn is_broadcast(&self) -> bool {
self.is_broadcast
}
#[must_use]
#[inline]
pub const fn is_packed(&self) -> bool {
self.element_size < self.size
}
#[must_use]
#[inline]
pub const fn element_count(&self) -> usize {
if self.element_size == self.size {
1
} else {
self.size as usize / self.element_size as usize
}
}
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[cfg_attr(not(feature = "exhaustive_enums"), non_exhaustive)]
#[allow(non_camel_case_types)]
pub enum MemorySize {
Unknown = 0,
UInt8 = 1,
UInt16 = 2,
UInt32 = 3,
UInt52 = 4,
UInt64 = 5,
UInt128 = 6,
UInt256 = 7,
UInt512 = 8,
Int8 = 9,
Int16 = 10,
Int32 = 11,
Int64 = 12,
Int128 = 13,
Int256 = 14,
Int512 = 15,
SegPtr16 = 16,
SegPtr32 = 17,
SegPtr64 = 18,
WordOffset = 19,
DwordOffset = 20,
QwordOffset = 21,
Bound16_WordWord = 22,
Bound32_DwordDword = 23,
Bnd32 = 24,
Bnd64 = 25,
Fword6 = 26,
Fword10 = 27,
Float16 = 28,
Float32 = 29,
Float64 = 30,
Float80 = 31,
Float128 = 32,
BFloat16 = 33,
FpuEnv14 = 34,
FpuEnv28 = 35,
FpuState94 = 36,
FpuState108 = 37,
Fxsave_512Byte = 38,
Fxsave64_512Byte = 39,
Xsave = 40,
Xsave64 = 41,
Bcd = 42,
Tilecfg = 43,
Tile = 44,
SegmentDescSelector = 45,
KLHandleAes128 = 46,
KLHandleAes256 = 47,
Packed16_UInt8 = 48,
Packed16_Int8 = 49,
Packed32_UInt8 = 50,
Packed32_Int8 = 51,
Packed32_UInt16 = 52,
Packed32_Int16 = 53,
Packed32_Float16 = 54,
Packed32_BFloat16 = 55,
Packed64_UInt8 = 56,
Packed64_Int8 = 57,
Packed64_UInt16 = 58,
Packed64_Int16 = 59,
Packed64_UInt32 = 60,
Packed64_Int32 = 61,
Packed64_Float16 = 62,
Packed64_Float32 = 63,
Packed128_UInt8 = 64,
Packed128_Int8 = 65,
Packed128_UInt16 = 66,
Packed128_Int16 = 67,
Packed128_UInt32 = 68,
Packed128_Int32 = 69,
Packed128_UInt52 = 70,
Packed128_UInt64 = 71,
Packed128_Int64 = 72,
Packed128_Float16 = 73,
Packed128_Float32 = 74,
Packed128_Float64 = 75,
Packed128_BFloat16 = 76,
Packed128_2xFloat16 = 77,
Packed128_2xBFloat16 = 78,
Packed256_UInt8 = 79,
Packed256_Int8 = 80,
Packed256_UInt16 = 81,
Packed256_Int16 = 82,
Packed256_UInt32 = 83,
Packed256_Int32 = 84,
Packed256_UInt52 = 85,
Packed256_UInt64 = 86,
Packed256_Int64 = 87,
Packed256_UInt128 = 88,
Packed256_Int128 = 89,
Packed256_Float16 = 90,
Packed256_Float32 = 91,
Packed256_Float64 = 92,
Packed256_Float128 = 93,
Packed256_BFloat16 = 94,
Packed256_2xFloat16 = 95,
Packed256_2xBFloat16 = 96,
Packed512_UInt8 = 97,
Packed512_Int8 = 98,
Packed512_UInt16 = 99,
Packed512_Int16 = 100,
Packed512_UInt32 = 101,
Packed512_Int32 = 102,
Packed512_UInt52 = 103,
Packed512_UInt64 = 104,
Packed512_Int64 = 105,
Packed512_UInt128 = 106,
Packed512_Float16 = 107,
Packed512_Float32 = 108,
Packed512_Float64 = 109,
Packed512_2xFloat16 = 110,
Packed512_2xBFloat16 = 111,
Broadcast32_Float16 = 112,
Broadcast64_UInt32 = 113,
Broadcast64_Int32 = 114,
Broadcast64_Float16 = 115,
Broadcast64_Float32 = 116,
Broadcast128_Int16 = 117,
Broadcast128_UInt16 = 118,
Broadcast128_UInt32 = 119,
Broadcast128_Int32 = 120,
Broadcast128_UInt52 = 121,
Broadcast128_UInt64 = 122,
Broadcast128_Int64 = 123,
Broadcast128_Float16 = 124,
Broadcast128_Float32 = 125,
Broadcast128_Float64 = 126,
Broadcast128_2xInt16 = 127,
Broadcast128_2xInt32 = 128,
Broadcast128_2xUInt32 = 129,
Broadcast128_2xFloat16 = 130,
Broadcast128_2xBFloat16 = 131,
Broadcast256_Int16 = 132,
Broadcast256_UInt16 = 133,
Broadcast256_UInt32 = 134,
Broadcast256_Int32 = 135,
Broadcast256_UInt52 = 136,
Broadcast256_UInt64 = 137,
Broadcast256_Int64 = 138,
Broadcast256_Float16 = 139,
Broadcast256_Float32 = 140,
Broadcast256_Float64 = 141,
Broadcast256_2xInt16 = 142,
Broadcast256_2xInt32 = 143,
Broadcast256_2xUInt32 = 144,
Broadcast256_2xFloat16 = 145,
Broadcast256_2xBFloat16 = 146,
Broadcast512_Int16 = 147,
Broadcast512_UInt16 = 148,
Broadcast512_UInt32 = 149,
Broadcast512_Int32 = 150,
Broadcast512_UInt52 = 151,
Broadcast512_UInt64 = 152,
Broadcast512_Int64 = 153,
Broadcast512_Float16 = 154,
Broadcast512_Float32 = 155,
Broadcast512_Float64 = 156,
Broadcast512_2xFloat16 = 157,
Broadcast512_2xInt16 = 158,
Broadcast512_2xUInt32 = 159,
Broadcast512_2xInt32 = 160,
Broadcast512_2xBFloat16 = 161,
}
#[rustfmt::skip]
static GEN_DEBUG_MEMORY_SIZE: [&str; 162] = [
"Unknown",
"UInt8",
"UInt16",
"UInt32",
"UInt52",
"UInt64",
"UInt128",
"UInt256",
"UInt512",
"Int8",
"Int16",
"Int32",
"Int64",
"Int128",
"Int256",
"Int512",
"SegPtr16",
"SegPtr32",
"SegPtr64",
"WordOffset",
"DwordOffset",
"QwordOffset",
"Bound16_WordWord",
"Bound32_DwordDword",
"Bnd32",
"Bnd64",
"Fword6",
"Fword10",
"Float16",
"Float32",
"Float64",
"Float80",
"Float128",
"BFloat16",
"FpuEnv14",
"FpuEnv28",
"FpuState94",
"FpuState108",
"Fxsave_512Byte",
"Fxsave64_512Byte",
"Xsave",
"Xsave64",
"Bcd",
"Tilecfg",
"Tile",
"SegmentDescSelector",
"KLHandleAes128",
"KLHandleAes256",
"Packed16_UInt8",
"Packed16_Int8",
"Packed32_UInt8",
"Packed32_Int8",
"Packed32_UInt16",
"Packed32_Int16",
"Packed32_Float16",
"Packed32_BFloat16",
"Packed64_UInt8",
"Packed64_Int8",
"Packed64_UInt16",
"Packed64_Int16",
"Packed64_UInt32",
"Packed64_Int32",
"Packed64_Float16",
"Packed64_Float32",
"Packed128_UInt8",
"Packed128_Int8",
"Packed128_UInt16",
"Packed128_Int16",
"Packed128_UInt32",
"Packed128_Int32",
"Packed128_UInt52",
"Packed128_UInt64",
"Packed128_Int64",
"Packed128_Float16",
"Packed128_Float32",
"Packed128_Float64",
"Packed128_BFloat16",
"Packed128_2xFloat16",
"Packed128_2xBFloat16",
"Packed256_UInt8",
"Packed256_Int8",
"Packed256_UInt16",
"Packed256_Int16",
"Packed256_UInt32",
"Packed256_Int32",
"Packed256_UInt52",
"Packed256_UInt64",
"Packed256_Int64",
"Packed256_UInt128",
"Packed256_Int128",
"Packed256_Float16",
"Packed256_Float32",
"Packed256_Float64",
"Packed256_Float128",
"Packed256_BFloat16",
"Packed256_2xFloat16",
"Packed256_2xBFloat16",
"Packed512_UInt8",
"Packed512_Int8",
"Packed512_UInt16",
"Packed512_Int16",
"Packed512_UInt32",
"Packed512_Int32",
"Packed512_UInt52",
"Packed512_UInt64",
"Packed512_Int64",
"Packed512_UInt128",
"Packed512_Float16",
"Packed512_Float32",
"Packed512_Float64",
"Packed512_2xFloat16",
"Packed512_2xBFloat16",
"Broadcast32_Float16",
"Broadcast64_UInt32",
"Broadcast64_Int32",
"Broadcast64_Float16",
"Broadcast64_Float32",
"Broadcast128_Int16",
"Broadcast128_UInt16",
"Broadcast128_UInt32",
"Broadcast128_Int32",
"Broadcast128_UInt52",
"Broadcast128_UInt64",
"Broadcast128_Int64",
"Broadcast128_Float16",
"Broadcast128_Float32",
"Broadcast128_Float64",
"Broadcast128_2xInt16",
"Broadcast128_2xInt32",
"Broadcast128_2xUInt32",
"Broadcast128_2xFloat16",
"Broadcast128_2xBFloat16",
"Broadcast256_Int16",
"Broadcast256_UInt16",
"Broadcast256_UInt32",
"Broadcast256_Int32",
"Broadcast256_UInt52",
"Broadcast256_UInt64",
"Broadcast256_Int64",
"Broadcast256_Float16",
"Broadcast256_Float32",
"Broadcast256_Float64",
"Broadcast256_2xInt16",
"Broadcast256_2xInt32",
"Broadcast256_2xUInt32",
"Broadcast256_2xFloat16",
"Broadcast256_2xBFloat16",
"Broadcast512_Int16",
"Broadcast512_UInt16",
"Broadcast512_UInt32",
"Broadcast512_Int32",
"Broadcast512_UInt52",
"Broadcast512_UInt64",
"Broadcast512_Int64",
"Broadcast512_Float16",
"Broadcast512_Float32",
"Broadcast512_Float64",
"Broadcast512_2xFloat16",
"Broadcast512_2xInt16",
"Broadcast512_2xUInt32",
"Broadcast512_2xInt32",
"Broadcast512_2xBFloat16",
];
impl fmt::Debug for MemorySize {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", GEN_DEBUG_MEMORY_SIZE[*self as usize])
}
}
impl Default for MemorySize {
#[must_use]
#[inline]
fn default() -> Self {
MemorySize::Unknown
}
}
#[allow(non_camel_case_types)]
#[allow(dead_code)]
pub(crate) type MemorySizeUnderlyingType = u8;
#[rustfmt::skip]
impl MemorySize {
#[inline]
pub fn values() -> impl Iterator<Item = MemorySize> + DoubleEndedIterator + ExactSizeIterator + FusedIterator {
(0..IcedConstants::MEMORY_SIZE_ENUM_COUNT).map(|x| unsafe { mem::transmute::<u8, MemorySize>(x as u8) })
}
}
#[test]
#[rustfmt::skip]
fn test_memorysize_values() {
let mut iter = MemorySize::values();
assert_eq!(iter.size_hint(), (IcedConstants::MEMORY_SIZE_ENUM_COUNT, Some(IcedConstants::MEMORY_SIZE_ENUM_COUNT)));
assert_eq!(iter.len(), IcedConstants::MEMORY_SIZE_ENUM_COUNT);
assert!(iter.next().is_some());
assert_eq!(iter.size_hint(), (IcedConstants::MEMORY_SIZE_ENUM_COUNT - 1, Some(IcedConstants::MEMORY_SIZE_ENUM_COUNT - 1)));
assert_eq!(iter.len(), IcedConstants::MEMORY_SIZE_ENUM_COUNT - 1);
let values: Vec<MemorySize> = MemorySize::values().collect();
assert_eq!(values.len(), IcedConstants::MEMORY_SIZE_ENUM_COUNT);
for (i, value) in values.into_iter().enumerate() {
assert_eq!(i, value as usize);
}
let values1: Vec<MemorySize> = MemorySize::values().collect();
let mut values2: Vec<MemorySize> = MemorySize::values().rev().collect();
values2.reverse();
assert_eq!(values1, values2);
}
#[rustfmt::skip]
impl TryFrom<usize> for MemorySize {
type Error = IcedError;
#[inline]
fn try_from(value: usize) -> Result<Self, Self::Error> {
if value < IcedConstants::MEMORY_SIZE_ENUM_COUNT {
Ok(unsafe { mem::transmute(value as u8) })
} else {
Err(IcedError::new("Invalid MemorySize value"))
}
}
}
#[test]
#[rustfmt::skip]
fn test_memorysize_try_from_usize() {
for value in MemorySize::values() {
let converted = <MemorySize as TryFrom<usize>>::try_from(value as usize).unwrap();
assert_eq!(converted, value);
}
assert!(<MemorySize as TryFrom<usize>>::try_from(IcedConstants::MEMORY_SIZE_ENUM_COUNT).is_err());
assert!(<MemorySize as TryFrom<usize>>::try_from(core::usize::MAX).is_err());
}
#[cfg(feature = "serde")]
#[rustfmt::skip]
#[allow(clippy::zero_sized_map_values)]
const _: () = {
use core::marker::PhantomData;
use serde::de;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
type EnumType = MemorySize;
impl Serialize for EnumType {
#[inline]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_u8(*self as u8)
}
}
impl<'de> Deserialize<'de> for EnumType {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct Visitor<'de> {
marker: PhantomData<EnumType>,
lifetime: PhantomData<&'de ()>,
}
impl<'de> de::Visitor<'de> for Visitor<'de> {
type Value = EnumType;
#[inline]
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("enum MemorySize")
}
#[inline]
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where
E: de::Error,
{
if let Ok(v) = <usize as TryFrom<_>>::try_from(v) {
if let Ok(value) = <EnumType as TryFrom<_>>::try_from(v) {
return Ok(value);
}
}
Err(de::Error::invalid_value(de::Unexpected::Unsigned(v), &"a valid MemorySize variant value"))
}
}
deserializer.deserialize_u8(Visitor { marker: PhantomData::<EnumType>, lifetime: PhantomData })
}
}
};
#[cfg(any(feature = "instr_info", feature = "encoder"))]
impl MemorySize {
#[must_use]
#[inline]
pub fn info(self) -> &'static MemorySizeInfo {
&MEMORY_SIZE_INFOS[self as usize]
}
#[must_use]
#[inline]
pub fn size(self) -> usize {
self.info().size()
}
#[must_use]
#[inline]
pub fn element_size(self) -> usize {
self.info().element_size()
}
#[must_use]
#[inline]
pub fn element_type(self) -> Self {
self.info().element_type()
}
#[must_use]
#[inline]
pub fn element_type_info(self) -> &'static MemorySizeInfo {
self.info().element_type().info()
}
#[must_use]
#[inline]
pub fn is_signed(self) -> bool {
self.info().is_signed()
}
#[must_use]
#[inline]
pub fn is_packed(self) -> bool {
self.info().is_packed()
}
#[must_use]
#[inline]
pub fn element_count(self) -> usize {
self.info().element_count()
}
}
#[cfg(any(feature = "instr_info", feature = "encoder", feature = "fast_fmt"))]
impl MemorySize {
#[must_use]
#[inline]
pub fn is_broadcast(self) -> bool {
self >= IcedConstants::FIRST_BROADCAST_MEMORY_SIZE
}
}