pub struct Type(_);
Expand description

The type of an SSA value.

The INVALID type isn’t a real type, and is used as a placeholder in the IR where a type field is present put no type is needed, such as the controlling type variable for a non-polymorphic instruction.

Basic integer types: I8, I16, I32, I64, and I128. These types are sign-agnostic.

Basic floating point types: F32 and F64. IEEE single and double precision.

Boolean types: B1, B8, B16, B32, B64, and B128. These all encode ‘true’ or ‘false’. The larger types use redundant bits.

SIMD vector types have power-of-two lanes, up to 256. Lanes can be any int/float/bool type.

Note that this is encoded in a u16 currently for extensibility, but allows only 14 bits to be used due to some bitpacking tricks in the CLIF data structures.

Implementations§

source§

impl Type

source

pub fn lane_type(self) -> Self

Get the lane type of this SIMD vector type.

A lane type is the same as a SIMD vector type with one lane, so it returns itself.

source

pub fn lane_of(self) -> Self

The type transformation that returns the lane type of a type variable; it is just a renaming of lane_type() to be used in context where we think in terms of type variable transformations.

source

pub fn log2_lane_bits(self) -> u32

Get log_2 of the number of bits in a lane.

source

pub fn lane_bits(self) -> u32

Get the number of bits in a lane.

source

pub fn bounds(self, signed: bool) -> (u128, u128)

Get the (minimum, maximum) values represented by each lane in the type. Note that these are returned as unsigned ‘bit patterns’.

source

pub fn int(bits: u16) -> Option<Self>

Get an integer type with the requested number of bits.

For the same thing but in bytes, use Self::int_with_byte_size.

source

pub fn int_with_byte_size(bytes: u16) -> Option<Self>

Get an integer type with the requested number of bytes.

For the same thing but in bits, use Self::int.

source

pub fn as_bool_pedantic(self) -> Self

Get a type with the same number of lanes as this type, but with the lanes replaced by booleans of the same size.

Lane types are treated as vectors with one lane, so they are converted to the multi-bit boolean types.

source

pub fn as_bool(self) -> Self

Get a type with the same number of lanes as this type, but with the lanes replaced by booleans of the same size.

Scalar types are all converted to b1 which is usually what you want.

source

pub fn as_int(self) -> Self

Get a type with the same number of lanes as this type, but with the lanes replaced by integers of the same size.

Scalar types follow this same rule, but b1 is converted into i8

source

pub fn half_width(self) -> Option<Self>

Get a type with the same number of lanes as this type, but with lanes that are half the number of bits.

source

pub fn double_width(self) -> Option<Self>

Get a type with the same number of lanes as this type, but with lanes that are twice the number of bits.

source

pub fn is_invalid(self) -> bool

Is this the INVALID type?

source

pub fn is_special(self) -> bool

Is this a special type?

source

pub fn is_lane(self) -> bool

Is this a lane type?

This is a scalar type that can also appear as the lane type of a SIMD vector.

source

pub fn is_vector(self) -> bool

Is this a SIMD vector type?

A vector type has 2 or more lanes.

source

pub fn is_dynamic_vector(self) -> bool

Is this a SIMD vector type with a runtime number of lanes?

source

pub fn is_bool(self) -> bool

Is this a scalar boolean type?

source

pub fn is_bool_vector(self) -> bool

Is this a vector boolean type?

source

pub fn is_int(self) -> bool

Is this a scalar integer type?

source

pub fn is_float(self) -> bool

Is this a scalar floating point type?

source

pub fn is_flags(self) -> bool

Is this a CPU flags type?

source

pub fn is_ref(self) -> bool

Is this a ref type?

source

pub fn log2_lane_count(self) -> u32

Get log_2 of the number of lanes in this SIMD vector type.

All SIMD types have a lane count that is a power of two and no larger than 256, so this will be a number in the range 0-8.

A scalar type is the same as a SIMD vector type with one lane, so it returns 0.

source

pub fn log2_min_lane_count(self) -> u32

Get log_2 of the number of lanes in this vector/dynamic type.

source

pub fn lane_count(self) -> u32

Get the number of lanes in this SIMD vector type.

A scalar type is the same as a SIMD vector type with one lane, so it returns 1.

source

pub fn bits(self) -> u32

Get the total number of bits used to represent this type.

source

pub fn min_lane_count(self) -> u32

Get the minimum of lanes in this SIMD vector type, this supports both fixed and dynamic types.

source

pub fn min_bits(self) -> u32

Get the minimum number of bits used to represent this type.

source

pub fn bytes(self) -> u32

Get the number of bytes used to store this type in memory.

source

pub fn by(self, n: u32) -> Option<Self>

Get a SIMD vector type with n times more lanes than this one.

If this is a scalar type, this produces a SIMD type with this as a lane type and n lanes.

If this is already a SIMD vector type, this produces a SIMD vector type with n * self.lane_count() lanes.

source

pub fn vector_to_dynamic(self) -> Option<Self>

Convert a fixed vector type to a dynamic one.

source

pub fn dynamic_to_vector(self) -> Option<Self>

Convert a dynamic vector type to a fixed one.

source

pub fn half_vector(self) -> Option<Self>

Get a SIMD vector with half the number of lanes.

There is no double_vector() method. Use t.by(2) instead.

source

pub fn split_lanes(self) -> Option<Self>

Split the lane width in half and double the number of lanes to maintain the same bit-width.

If this is a scalar type of n bits, it produces a SIMD vector type of (n/2)x2.

source

pub fn merge_lanes(self) -> Option<Self>

Merge lanes to half the number of lanes and double the lane width to maintain the same bit-width.

If this is a scalar type, it will return None.

source

pub fn index(self) -> usize

Index of this type, for use with hash tables etc.

source

pub fn wider_or_equal(self, other: Self) -> bool

True iff:

  1. self.lane_count() == other.lane_count() and
  2. self.lane_bits() >= other.lane_bits()
source

pub fn triple_pointer_type(triple: &Triple) -> Self

Return the pointer type for the given target triple.

source

pub fn coerce_bools_to_ints(self) -> Self

Coerces boolean types (scalar and vectors) into their integer counterparts. B1 is converted into I8.

Trait Implementations§

source§

impl Clone for Type

source§

fn clone(&self) -> Type

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Type

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Type

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl Display for Type

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Type

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Type> for Type

source§

fn eq(&self, other: &Type) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Copy for Type

source§

impl Eq for Type

source§

impl StructuralEq for Type

source§

impl StructuralPartialEq for Type

Auto Trait Implementations§

§

impl RefUnwindSafe for Type

§

impl Send for Type

§

impl Sync for Type

§

impl Unpin for Type

§

impl UnwindSafe for Type

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CallHasher for Twhere T: Hash + ?Sized,

source§

default fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where H: Hash + ?Sized, B: BuildHasher,

source§

impl<Q, K> Equivalent<K> for Qwhere Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.