package base:intrinsics
Overview
package intrinsics provides documentation for Odin's compiler-level intrinsics.
Index
Constants (0)
This section is empty.
Procedures (212)
- transpose
- outer_product
- hadamard_product
- matrix_flatten
- soa_struct
- volatile_load
- volatile_store
- non_temporal_load
- non_temporal_store
- debug_trap
- trap
- alloca
- cpu_relax
- read_cycle_counter
- count_ones
- count_zeros
- count_trailing_zeros
- count_leading_zeros
- reverse_bits
- byte_swap
- overflow_add
- overflow_sub
- overflow_mul
- saturating_add
- saturating_sub
- sqrt
- fused_mul_add
- mem_copy
- mem_copy_non_overlapping
- mem_zero
- mem_zero_volatile
- ptr_offset
- ptr_sub
- unaligned_load
- unaligned_store
- fixed_point_mul
- fixed_point_div
- fixed_point_mul_sat
- fixed_point_div_sat
- prefetch_read_instruction
- prefetch_read_data
- prefetch_write_instruction
- prefetch_write_data
- expect
- syscall
- syscall_bsd
- atomic_type_is_lock_free
- atomic_thread_fence
- atomic_signal_fence
- atomic_store
- atomic_store_explicit
- atomic_load
- atomic_load_explicit
- atomic_add
- atomic_add_explicit
- atomic_sub
- atomic_sub_explicit
- atomic_and
- atomic_and_explicit
- atomic_nand
- atomic_nand_explicit
- atomic_or
- atomic_or_explicit
- atomic_xor
- atomic_xor_explicit
- atomic_exchange
- atomic_exchange_explicit
- atomic_compare_exchange_strong
- atomic_compare_exchange_strong_explicit
- atomic_compare_exchange_weak
- atomic_compare_exchange_weak_explicit
- type_base_type
- type_core_type
- type_elem_type
- type_is_boolean
- type_is_integer
- type_is_rune
- type_is_float
- type_is_complex
- type_is_quaternion
- type_is_string
- type_is_typeid
- type_is_any
- type_is_endian_platform
- type_is_endian_little
- type_is_endian_big
- type_is_unsigned
- type_is_numeric
- type_is_ordered
- type_is_ordered_numeric
- type_is_indexable
- type_is_sliceable
- type_is_comparable
- type_is_simple_compare
- type_is_dereferenceable
- type_is_valid_map_key
- type_is_valid_matrix_elements
- type_is_named
- type_is_pointer
- type_is_multi_pointer
- type_is_array
- type_is_enumerated_array
- type_is_slice
- type_is_dynamic_array
- type_is_map
- type_is_struct
- type_is_union
- type_is_enum
- type_is_proc
- type_is_bit_set
- type_is_simd_vector
- type_is_matrix
- type_has_nil
- type_is_matrix_row_major
- type_is_matrix_column_major
- type_is_specialization_of
- type_is_variant_of
- type_union_tag_type
- type_union_tag_offset
- type_union_base_tag_value
- type_union_variant_count
- type_variant_type_of
- type_variant_index_of
- type_bit_set_elem_type
- type_bit_set_underlying_type
- type_has_field
- type_field_type
- type_proc_parameter_count
- type_proc_return_count
- type_proc_parameter_type
- type_proc_return_type
- type_struct_field_count
- type_struct_has_implicit_padding
- type_polymorphic_record_parameter_count
- type_polymorphic_record_parameter_value
- type_is_specialized_polymorphic_record
- type_is_unspecialized_polymorphic_record
- type_is_subtype_of
- type_field_index_of
- type_equal_proc
- type_hasher_proc
- type_map_info
- type_map_cell_info
- type_convert_variants_to_pointers
- type_merge
- constant_utf16_cstring
- constant_log2
- simd_add
- simd_sub
- simd_mul
- simd_div
- simd_saturating_add
- simd_saturating_sub
- simd_shl
- simd_shr
- simd_shl_masked
- simd_shr_masked
- simd_bit_and
- simd_bit_or
- simd_bit_xor
- simd_bit_and_not
- simd_neg
- simd_abs
- simd_min
- simd_max
- simd_clamp
- simd_lanes_eq
- simd_lanes_ne
- simd_lanes_lt
- simd_lanes_le
- simd_lanes_gt
- simd_lanes_ge
- simd_extract
- simd_replace
- simd_reduce_add_ordered
- simd_reduce_mul_ordered
- simd_reduce_min
- simd_reduce_max
- simd_reduce_and
- simd_reduce_or
- simd_reduce_xor
- simd_reduce_any
- simd_reduce_all
- simd_gather
- simd_scatter
- simd_masked_load
- simd_masked_store
- simd_masked_expand_load
- simd_masked_compress_store
- simd_shuffle
- simd_select
- simd_ceil
- simd_floor
- simd_trunc
- simd_nearest
- simd_to_bits
- simd_lanes_reverse
- simd_lanes_rotate_left
- simd_lanes_rotate_right
- has_target_feature
- procedure_of
- wasm_memory_grow
- wasm_memory_size
- wasm_memory_atomic_wait32
- wasm_memory_atomic_notify32
- x86_cpuid
- x86_xgetbv
- objc_find_selector
- objc_register_selector
- objc_find_class
- objc_register_class
- valgrind_client_request
Procedure Groups (0)
This section is empty.
Constants
Types
Atomic_Memory_Order ¶
Atomic_Memory_Order :: enum { Relaxed = 0, // Unordered Consume = 1, // Monotonic Acquire = 2, Release = 3, Acq_Rel = 4, Seq_Cst = 5, }
An enumeration of atomic memory orderings used by the atomic_*_explicit
intrinsics that determines which atomic instructions on the same address they synchronize with.This follows the same memory model as C11/C++11.
objc_selector ¶
objc_selector :: struct {}
Darwin targets only
Represents an Objective-C selector
type.
Procedures
transpose ¶
transpose :: proc(m: $M/matrix[$R, $C]$E) -> matrix[C, R]E {…}
outer_product ¶
outer_product :: proc(a: $A/[$X]$E, b: $B/[$Y]E) -> matrix[X, Y]E {…}
hadamard_product ¶
hadamard_product :: proc(a, b: $T/matrix[$R, $C]$E) -> T {…}
matrix_flatten ¶
matrix_flatten :: proc(m: $T/matrix[$R, $C]$E) -> [R*C]E {…}
soa_struct ¶
soa_struct :: proc($N: int, $T: typeid) -> type/#soa[N]T {…}
A call-like way to construct an #soa struct. Possibly to be deprecated in the future.
volatile_load ¶
volatile_load :: proc(dst: ^$T) -> T {…}
Tells the optimizing backend of a compiler to not change the number of 'volatile' operations nor change their order of execution relative to other 'volatile' operations. Optimizers are allowed to change the order of volatile operations relative to non-volatile operations.
NOTE: This has nothing to do with Java's 'volatile' and has no cross-thread synchronization behaviour. Use atomics if this behaviour is wanted.
volatile_store ¶
volatile_store :: proc(dst: ^$T, val: T) {…}
Tells the optimizing backend of a compiler to not change the number of 'volatile' operations nor change their order of execution relative to other 'volatile' operations. Optimizers are allowed to change the order of volatile operations relative to non-volatile operations.
NOTE: This has nothing to do with Java's 'volatile' and has no cross-thread synchronization behaviour. Use atomics if this behaviour is wanted.
non_temporal_load ¶
non_temporal_load :: proc(dst: ^$T) -> T {…}
Tells the code generator of a compiler that this operation is not expected to be reused in the cache. The code generator may select special instructions to save cache bandwidth (e.g. on x86, movnt
instruct might be used).
non_temporal_store ¶
non_temporal_store :: proc(dst: ^$T, val: T) {…}
Tells the code generator of a compiler that this operation is not expected to be reused in the cache. The code generator may select special instructions to save cache bandwidth (e.g. on x86, movnt
instruct might be used).
debug_trap ¶
debug_trap :: proc() {…}
A call intended to cause an execution trap with the intention of requesting a debugger's attention.
alloca ¶
alloca :: proc(size, align: int) -> [^]byte {…}
A procedure that allocates size
bytes of space in the stack frame of the caller, aligned to align
bytes. This temporary space is automatically freed when the procedure that called alloca
returns to its caller.
cpu_relax ¶
cpu_relax :: proc() {…}
On i386/amd64, it should map to the pause
instruction. On arm64, it should map to isb
instruction (see https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8258604 for more information).
read_cycle_counter ¶
read_cycle_counter :: proc() -> i64 {…}
This provides access to the cycle counter register (or similar low latency, high accuracy clocks) on the targets that support it. On i386/amd64, it should map to the rdtsc
instruction. On arm64, it should map to the cntvct_el0
instruction.
count_ones ¶
count_ones :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) {…}
Counts the number of set bits (1
s).
count_zeros ¶
count_zeros :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) {…}
Counts the number of unset bits (0
s).
count_trailing_zeros ¶
count_trailing_zeros :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) {…}
Counts the number of trailing unset bits (0
s) until a set bit (1
) is seen or all bits have been counted.
count_leading_zeros ¶
count_leading_zeros :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) {…}
Counts the number of leading unset bits (0
s) until a set bit (1
) is seen or all bits have been counted.
reverse_bits ¶
reverse_bits :: proc(x: $T) -> T where type_is_integer(T) || type_is_simd_vector(T) {…}
Reverses the bits from ascending order to descending order e.g. 0b01110101 -> 0b10101110
byte_swap ¶
byte_swap :: proc(x: $T) -> T where type_is_integer(T) || type_is_float(T) {…}
Reverses the bytes from ascending order to descending order e.g. 0xfe_ed_01_12 -> `0x12_01_ed_fe
overflow_add ¶
overflow_add :: proc(lhs, rhs: $T) -> (T, bool) where type_is_integer(T) #optional_ok {…}
Performs an "add" operation with an overflow check. The second return value will be true if an overflow occurs.
overflow_sub ¶
overflow_sub :: proc(lhs, rhs: $T) -> (T, bool) where type_is_integer(T) #optional_ok {…}
Performs a "subtract" operation with an overflow check. The second return value will be true if an overflow occurs.
overflow_mul ¶
overflow_mul :: proc(lhs, rhs: $T) -> (T, bool) where type_is_integer(T) #optional_ok {…}
Performs a "multiply" operation with an overflow check. The second return value will be true if an overflow occurs.
saturating_add ¶
saturating_add :: proc(lhs, rhs: $T) -> T -> where type_is_integer(T) {…}
Performs a saturating "add" operation, where the return value is clamped between min(T)
and max(T)
.
saturating_sub ¶
saturating_sub :: proc(lhs, rhs: $T) -> T -> where type_is_integer(T) {…}
Performs a saturating "subtract" operation, where the return value is clamped between min(T)
and max(T)
.
sqrt ¶
sqrt :: proc(x: $T) -> T where type_is_float(T) || (type_is_simd_vector(T) && type_is_float(type_elem_type(T))) {…}
Returns the square root of a value. If the input value is negative, this is platform defined behaviour.
fused_mul_add ¶
fused_mul_add :: proc(a, b, c: $T) -> T where type_is_float(T) || (type_is_simd_vector(T) && type_is_float(type_elem_type(T))) {…}
mem_copy ¶
Copies a block of memory from the src
location to the dst
location but assumes that the memory ranges could be overlapping. It is equivalent to C's memmove
, but unlike the C's libc procedure, it does not return value.
mem_copy_non_overlapping ¶
Copies a block of memory from the src
location to the dst
location but it does not assume the memory ranges could be overlapping. It is equivalent to C's memcpy
, but unlike the C's libc procedure, it does not return value.
mem_zero ¶
Zeroes a block of memory at the ptr
location for len
bytes.
mem_zero_volatile ¶
Zeroes a block of memory at the ptr
location for len
bytes with volatile semantics.
ptr_offset ¶
ptr_offset :: proc(ptr: ^$T, offset: int) -> ^T {…}
Prefer using [^]T operations if possible. e.g. ptr[offset:]
ptr_sub ¶
ptr_sub :: proc(a, b: ^$T) -> int {…}
Equivalent to int(uintptr(a) - uintptr(b)) / size_of(T)
unaligned_load ¶
unaligned_load :: proc(src: ^$T) -> T {…}
Performs a load on an unaligned value src
.
unaligned_store ¶
unaligned_store :: proc(dst: ^$T, val: T) -> T {…}
Performs a store on an unaligned value dst
.
fixed_point_mul ¶
fixed_point_mul :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) {…}
A fixed point number represents a real data type for a number that has a fixed number of digits after a radix point. The number of digits after the radix point is referred to as scale
.
fixed_point_div ¶
fixed_point_div :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) {…}
A fixed point number represents a real data type for a number that has a fixed number of digits after a radix point. The number of digits after the radix point is referred to as scale
.
fixed_point_mul_sat ¶
fixed_point_mul_sat :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) {…}
A fixed point number represents a real data type for a number that has a fixed number of digits after a radix point. The number of digits after the radix point is referred to as scale
.
fixed_point_div_sat ¶
fixed_point_div_sat :: proc(lhs, rhs: $T, #const scale: uint) -> T where type_is_integer(T) {…}
A fixed point number represents a real data type for a number that has a fixed number of digits after a radix point. The number of digits after the radix point is referred to as scale
.
prefetch_read_instruction ¶
The prefetch_*
intrinsic are a hint to the code generator to insert a prefetch instruction if supported; otherwise, it is a no-op. Prefetches have no affect on the behaviour of the program but can change its performance characteristics.
The locality
parameter must be a constant integer, and its temporal locality value ranges from 0
(no locality) to 3
(extremely local, keep in cache).
prefetch_read_data ¶
The prefetch_*
intrinsic are a hint to the code generator to insert a prefetch instruction if supported; otherwise, it is a no-op. Prefetches have no affect on the behaviour of the program but can change its performance characteristics.
The locality
parameter must be a constant integer, and its temporal locality value ranges from 0
(no locality) to 3
(extremely local, keep in cache).
prefetch_write_instruction ¶
The prefetch_*
intrinsic are a hint to the code generator to insert a prefetch instruction if supported; otherwise, it is a no-op. Prefetches have no affect on the behaviour of the program but can change its performance characteristics.
The locality
parameter must be a constant integer, and its temporal locality value ranges from 0
(no locality) to 3
(extremely local, keep in cache).
prefetch_write_data ¶
The prefetch_*
intrinsic are a hint to the code generator to insert a prefetch instruction if supported; otherwise, it is a no-op. Prefetches have no affect on the behaviour of the program but can change its performance characteristics.
The locality
parameter must be a constant integer, and its temporal locality value ranges from 0
(no locality) to 3
(extremely local, keep in cache).
expect ¶
expect :: proc(val, expected_val: T) -> T {…}
Provides information about expected (the most probable) value of val
, which can be used by optimizing backends.
syscall_bsd ¶
FreeBSD, NetBSD, etc.
atomic_type_is_lock_free ¶
atomic_type_is_lock_free :: proc($T: typeid) -> bool {…}
atomic_thread_fence ¶
atomic_thread_fence :: proc(order: Atomic_Memory_Order) {…}
Adds a "fence" to introduce a "happens-before" edges between operations.
atomic_signal_fence ¶
atomic_signal_fence :: proc(order: Atomic_Memory_Order) {…}
Adds a "fence" to introduce a "happens-before" edges between operations.
atomic_store ¶
atomic_store :: proc(dst: ^$T, val: T) {…}
atomic_store_explicit ¶
atomic_store_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) {…}
atomic_load ¶
atomic_load :: proc(dst: ^$T) -> T {…}
atomic_load_explicit ¶
atomic_load_explicit :: proc(dst: ^$T, order: Atomic_Memory_Order) -> T {…}
atomic_add ¶
atomic_add :: proc(dst: ^$T, val: T) -> T {…}
atomic_add_explicit ¶
atomic_add_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) -> T {…}
atomic_sub ¶
atomic_sub :: proc(dst: ^$T, val: T) -> T {…}
atomic_sub_explicit ¶
atomic_sub_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) -> T {…}
atomic_and ¶
atomic_and :: proc(dst: ^$T, val: T) -> T {…}
atomic_and_explicit ¶
atomic_and_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) -> T {…}
atomic_nand ¶
atomic_nand :: proc(dst: ^$T, val: T) -> T {…}
atomic_nand_explicit ¶
atomic_nand_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) -> T {…}
atomic_or ¶
atomic_or :: proc(dst: ^$T, val: T) -> T {…}
atomic_or_explicit ¶
atomic_or_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) -> T {…}
atomic_xor ¶
atomic_xor :: proc(dst: ^$T, val: T) -> T {…}
atomic_xor_explicit ¶
atomic_xor_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) -> T {…}
atomic_exchange ¶
atomic_exchange :: proc(dst: ^$T, val: T) -> T {…}
atomic_exchange_explicit ¶
atomic_exchange_explicit :: proc(dst: ^$T, val: T, order: Atomic_Memory_Order) -> T {…}
atomic_compare_exchange_strong ¶
atomic_compare_exchange_strong :: proc(dst: ^$T, old, new: T) -> (T, bool) #optional_ok {…}
atomic_compare_exchange_strong_explicit ¶
atomic_compare_exchange_strong_explicit :: proc(dst: ^$T, old, new: T, success, failure: Atomic_Memory_Order) -> (T, bool) #optional_ok {…}
atomic_compare_exchange_weak ¶
atomic_compare_exchange_weak :: proc(dst: ^$T, old, new: T) -> (T, bool) #optional_ok {…}
atomic_compare_exchange_weak_explicit ¶
atomic_compare_exchange_weak_explicit :: proc(dst: ^$T, old, new: T, success, failure: Atomic_Memory_Order) -> (T, bool) #optional_ok {…}
type_base_type ¶
type_base_type :: proc($T: typeid) -> type {…}
Returns the type without any distinct
indirection e.g. Foo :: distinct int
, type_base_type(Foo) == int
type_core_type ¶
type_core_type :: proc($T: typeid) -> type {…}
Returns the type without any distinct
indirection and the underlying integer type for an enum e.g. Foo :: distinct int
, type_core_type(Foo) == int
, or Bar :: enum u8 {A}
, type_core_type(Bar) == u8
type_elem_type ¶
type_elem_type :: proc($T: typeid) -> type {…}
Returns the element type of an compound type.
Complex number: the underlying float type (e.g. complex64 -> f32
)
Quaternion: the underlying float type (e.g. quaternion256 -> f64
)
Pointer: the base type (e.g. ^T -> T
)
Array: the element type (e.g. [N]T -> T
)
Enumerated Array: the element type (e.g. [Enum]T -> T
)
Slice: the element type (e.g. []T -> T
)
Dynamic Array: the element type (e.g. [dynamic]T -> T
)
type_is_boolean ¶
type_is_boolean :: proc($T: typeid) -> bool {…}
type_is_integer ¶
type_is_integer :: proc($T: typeid) -> bool {…}
type_is_rune ¶
type_is_rune :: proc($T: typeid) -> bool {…}
type_is_float ¶
type_is_float :: proc($T: typeid) -> bool {…}
type_is_complex ¶
type_is_complex :: proc($T: typeid) -> bool {…}
type_is_quaternion ¶
type_is_quaternion :: proc($T: typeid) -> bool {…}
type_is_string ¶
type_is_string :: proc($T: typeid) -> bool {…}
type_is_typeid ¶
type_is_typeid :: proc($T: typeid) -> bool {…}
type_is_any ¶
type_is_any :: proc($T: typeid) -> bool {…}
type_is_endian_platform ¶
type_is_endian_platform :: proc($T: typeid) -> bool {…}
type_is_endian_little ¶
type_is_endian_little :: proc($T: typeid) -> bool {…}
type_is_endian_big ¶
type_is_endian_big :: proc($T: typeid) -> bool {…}
type_is_unsigned ¶
type_is_unsigned :: proc($T: typeid) -> bool {…}
type_is_numeric ¶
type_is_numeric :: proc($T: typeid) -> bool {…}
Returns true if a "numeric" in nature:
Any integer Any float Any complex number Any quaternion Any enum Any fixed-array of a numeric type
type_is_ordered ¶
type_is_ordered :: proc($T: typeid) -> bool {…}
type_is_ordered_numeric ¶
type_is_ordered_numeric :: proc($T: typeid) -> bool {…}
type_is_indexable ¶
type_is_indexable :: proc($T: typeid) -> bool {…}
type_is_sliceable ¶
type_is_sliceable :: proc($T: typeid) -> bool {…}
type_is_comparable ¶
type_is_comparable :: proc($T: typeid) -> bool {…}
Returns true if the type is comparable, which allows for the use of ==
and !=
binary operators.
One of the following non-compound types (as well as any distinct
forms): rune
, string
, cstring
, typeid
, pointer, #soa
related pointer, multi-pointer, enum, procedure, matrix, bit_set
, #simd
vector.
One of the following compound types (as well as any distinct
forms): any array or enumerated array where its element type is also comparable; any struct
where all of its fields are comparable; any struct #raw_union
were all of its fields are simply comparable (see type_is_simple_compare
); any union
where all of its variants are comparable.
type_is_simple_compare ¶
type_is_simple_compare :: proc($T: typeid) -> bool {…}
easily compared using memcmp (== and !=)
type_is_dereferenceable ¶
type_is_dereferenceable :: proc($T: typeid) -> bool {…}
Must be a pointer type ^T
(not rawptr
) or an #soa
related pointer type.
type_is_valid_map_key ¶
type_is_valid_map_key :: proc($T: typeid) -> bool {…}
Any comparable type which is not-untyped nor generic.
type_is_valid_matrix_elements ¶
type_is_valid_matrix_elements :: proc($T: typeid) -> bool {…}
Any integer, float, or complex number type (not-untyped).
type_is_named ¶
type_is_named :: proc($T: typeid) -> bool {…}
type_is_pointer ¶
type_is_pointer :: proc($T: typeid) -> bool {…}
type_is_multi_pointer ¶
type_is_multi_pointer :: proc($T: typeid) -> bool {…}
type_is_array ¶
type_is_array :: proc($T: typeid) -> bool {…}
type_is_enumerated_array ¶
type_is_enumerated_array :: proc($T: typeid) -> bool {…}
type_is_slice ¶
type_is_slice :: proc($T: typeid) -> bool {…}
type_is_dynamic_array ¶
type_is_dynamic_array :: proc($T: typeid) -> bool {…}
type_is_map ¶
type_is_map :: proc($T: typeid) -> bool {…}
type_is_struct ¶
type_is_struct :: proc($T: typeid) -> bool {…}
type_is_union ¶
type_is_union :: proc($T: typeid) -> bool {…}
type_is_enum ¶
type_is_enum :: proc($T: typeid) -> bool {…}
type_is_proc ¶
type_is_proc :: proc($T: typeid) -> bool {…}
type_is_bit_set ¶
type_is_bit_set :: proc($T: typeid) -> bool {…}
type_is_simd_vector ¶
type_is_simd_vector :: proc($T: typeid) -> bool {…}
type_is_matrix ¶
type_is_matrix :: proc($T: typeid) -> bool {…}
type_has_nil ¶
type_has_nil :: proc($T: typeid) -> bool {…}
Types that support nil
:
rawptr
any
cstring
typeid
enum
bit_set
Slices
proc
values
Pointers
#soa Pointers
Multi-Pointers
Dynamic Arrays
map
union
without the #no_nil
directive
#soa
slices
#soa
dynamic arrays
type_is_matrix_row_major ¶
type_is_matrix_row_major :: proc($T: typeid) -> bool where type_is_matrix(T) {…}
type_is_matrix_column_major ¶
type_is_matrix_column_major :: proc($T: typeid) -> bool where type_is_matrix(T) {…}
type_is_specialization_of ¶
type_is_specialization_of :: proc($T, $S: typeid) -> bool {…}
type_is_variant_of ¶
type_is_variant_of :: proc($U, $V: typeid) -> bool where type_is_union(U) {…}
type_union_tag_type ¶
type_union_tag_type :: proc($T: typeid) -> typeid where type_is_union(T) {…}
type_union_tag_offset ¶
type_union_tag_offset :: proc($T: typeid) -> uintptr where type_is_union(T) {…}
type_union_base_tag_value ¶
type_union_base_tag_value :: proc($T: typeid) -> int where type_is_union(U) {…}
type_union_variant_count ¶
type_union_variant_count :: proc($T: typeid) -> int where type_is_union(T) {…}
type_variant_type_of ¶
type_variant_type_of :: proc($T: typeid, $index: int) -> typeid where type_is_union(T) {…}
type_variant_index_of ¶
type_variant_index_of :: proc($U, $V: typeid) -> int where type_is_union(U) {…}
type_bit_set_elem_type ¶
type_bit_set_elem_type :: proc($T: typeid) -> typeid where type_is_bit_set(T) {…}
type_bit_set_underlying_type ¶
type_bit_set_underlying_type :: proc($T: typeid) -> typeid where type_is_bit_set(T) {…}
type_field_type ¶
type_field_type :: proc($T: typeid, $name: string) -> typeid {…}
type_proc_parameter_count ¶
type_proc_parameter_count :: proc($T: typeid) -> int where type_is_proc(T) {…}
type_proc_return_count ¶
type_proc_return_count :: proc($T: typeid) -> int where type_is_proc(T) {…}
type_proc_parameter_type ¶
type_proc_parameter_type :: proc($T: typeid, index: int) -> typeid where type_is_proc(T) {…}
type_proc_return_type ¶
type_proc_return_type :: proc($T: typeid, index: int) -> typeid where type_is_proc(T) {…}
type_struct_field_count ¶
type_struct_field_count :: proc($T: typeid) -> int where type_is_struct(T) {…}
type_struct_has_implicit_padding ¶
type_struct_has_implicit_padding :: proc($T: typeid) -> bool where type_is_struct(T) {…}
type_polymorphic_record_parameter_count ¶
type_polymorphic_record_parameter_count :: proc($T: typeid) -> typeid {…}
type_polymorphic_record_parameter_value ¶
type_polymorphic_record_parameter_value :: proc($T: typeid, index: int) -> $V {…}
type_is_specialized_polymorphic_record ¶
type_is_specialized_polymorphic_record :: proc($T: typeid) -> bool {…}
type_is_unspecialized_polymorphic_record ¶
type_is_unspecialized_polymorphic_record :: proc($T: typeid) -> bool {…}
type_is_subtype_of ¶
type_is_subtype_of :: proc($T, $U: typeid) -> bool {…}
type_equal_proc ¶
type_equal_proc :: proc($T: typeid) -> (equal: proc "contextless" (rawptr, rawptr) -> bool) where type_is_comparable(T) {…}
Returns the underlying procedure that is used to compare pointers to two values of the same time together. This is used by the map
type and general complicated comparisons.
type_hasher_proc ¶
type_hasher_proc :: proc($T: typeid) -> (hasher: proc "contextless" (data: rawptr, seed: uintptr) -> uintptr) where type_is_comparable(T) {…}
Returns the underlying procedure that is used to hash a pointer to a value used by the map
type.
type_map_info ¶
type_map_info :: proc($T: typeid/map[$K]$V) -> ^runtime.Map_Info {…}
type_map_cell_info ¶
type_map_cell_info :: proc($T: typeid) -> ^runtime.Map_Cell_Info {…}
type_convert_variants_to_pointers ¶
type_convert_variants_to_pointers :: proc($T: typeid) -> typeid where type_is_union(T) {…}
Returns a type which converts all of the variants of a union
to be pointer types of those variants.
Example:
Foo :: union {A, B, C}
type_convert_variants_to_pointers(Foo) == union {^A, ^B, ^C}
type_merge ¶
type_merge :: proc($U, $V: typeid) -> typeid where type_is_union(U), type_is_union(V) {…}
constant_utf16_cstring ¶
Returns a runtime value of a constant string UTF-8 value encoded as a UTF-16 NULL terminated string value, useful for interfacing with UTF-16 procedure such as the Windows API.
constant_log2 ¶
constant_log2 :: proc($v: $T) -> T where type_is_integer(T) {…}
Returns the log2 value of the given constant integer.
simd_add ¶
simd_add :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_sub ¶
simd_sub :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_mul ¶
simd_mul :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_div ¶
simd_div :: proc(a, b: #simd[N]T) -> #simd[N]T where type_is_float(T) {…}
simd_saturating_add ¶
simd_saturating_add :: proc(a, b: #simd[N]T) -> #simd[N]T where type_is_integer(T) {…}
simd_saturating_sub ¶
simd_saturating_sub :: proc(a, b: #simd[N]T) -> #simd[N]T where type_is_integer(T) {…}
simd_shl ¶
simd_shl :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T {…}
Keeps Odin's behaviour: (x << y) if y <= mask else 0
simd_shr ¶
simd_shr :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T {…}
Keeps Odin's behaviour: `(x >> y) if y <= mask else 0
simd_shl_masked ¶
simd_shl_masked :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T {…}
Similar to C's behaviour: x << (y & mask)
simd_shr_masked ¶
simd_shr_masked :: proc(a: #simd[N]T, b: #simd[N]Unsigned_Integer) -> #simd[N]T {…}
Similar to C's behaviour: `x >> (y & mask)
simd_bit_and ¶
simd_bit_and :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_bit_or ¶
simd_bit_or :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_bit_xor ¶
simd_bit_xor :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_bit_and_not ¶
simd_bit_and_not :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_neg ¶
simd_neg :: proc(a: #simd[N]T) -> #simd[N]T {…}
simd_abs ¶
simd_abs :: proc(a: #simd[N]T) -> #simd[N]T {…}
simd_min ¶
simd_min :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_max ¶
simd_max :: proc(a, b: #simd[N]T) -> #simd[N]T {…}
simd_clamp ¶
simd_clamp :: proc(v, min, max: #simd[N]T) -> #simd[N]T {…}
simd_lanes_eq ¶
simd_lanes_eq :: proc(a, b: #simd[N]T) -> #simd[N]Integer {…}
Return an unsigned integer of the same size as the input type, NOT A BOOLEAN. element-wise: false => 0x00...00
, true => 0xff...ff
simd_lanes_ne ¶
simd_lanes_ne :: proc(a, b: #simd[N]T) -> #simd[N]Integer {…}
Return an unsigned integer of the same size as the input type, NOT A BOOLEAN. element-wise: false => 0x00...00
, true => 0xff...ff
simd_lanes_lt ¶
simd_lanes_lt :: proc(a, b: #simd[N]T) -> #simd[N]Integer {…}
Return an unsigned integer of the same size as the input type, NOT A BOOLEAN. element-wise: false => 0x00...00
, true => 0xff...ff
simd_lanes_le ¶
simd_lanes_le :: proc(a, b: #simd[N]T) -> #simd[N]Integer {…}
Return an unsigned integer of the same size as the input type, NOT A BOOLEAN. element-wise: false => 0x00...00
, true => 0xff...ff
simd_lanes_gt ¶
simd_lanes_gt :: proc(a, b: #simd[N]T) -> #simd[N]Integer {…}
Return an unsigned integer of the same size as the input type, NOT A BOOLEAN. element-wise: false => 0x00...00
, true => 0xff...ff
simd_lanes_ge ¶
simd_lanes_ge :: proc(a, b: #simd[N]T) -> #simd[N]Integer {…}
Return an unsigned integer of the same size as the input type, NOT A BOOLEAN. element-wise: false => 0x00...00
, true => 0xff...ff
simd_extract ¶
simd_extract :: proc(a: #simd[N]T, idx: uint) -> T {…}
Extracts a single scalar element from a #simd
vector at a specified index.
simd_replace ¶
simd_replace :: proc(a: #simd[N]T, idx: uint, elem: T) -> #simd[N]T {…}
Replaces a single scalar element from a #simd
vector and returns a new vector.
simd_reduce_add_ordered ¶
simd_reduce_add_ordered :: proc(a: #simd[N]T) -> T {…}
Performs a reduction of a #simd
vector a
, returning the result as a scalar. The return type matches the element-type T
of the #simd
vector input. See the following pseudocode:
simd_reduce_add_ordered :: proc(v: #simd[N]T) -> T { result := simd_extract(v, 0) for i in 1..<N { e := simd_extract(v, i) result = result + e } return result }
simd_reduce_mul_ordered ¶
simd_reduce_mul_ordered :: proc(a: #simd[N]T) -> T {…}
Performs a reduction of a #simd
vector a
, returning the result as a scalar. The return type matches the element-type T
of the #simd
vector input. See the following pseudocode:
simd_reduce_mul_ordered :: proc(v: #simd[N]T) -> T { result := simd_extract(v, 0) for i in 1..<N { e := simd_extract(v, i) result = result * e } return result }
simd_reduce_min ¶
simd_reduce_min :: proc(a: #simd[N]T) -> T {…}
Performs a reduction of a #simd
vector a
, returning the result as a scalar. The return type matches the element-type T
of the #simd
vector input. See the following pseudocode:
simd_reduce_min :: proc(v: #simd[N]T) -> T { result := simd_extract(v, 0) for i in 1..<N { e := simd_extract(v, i) result = min(result, e) } return result }
simd_reduce_max ¶
simd_reduce_max :: proc(a: #simd[N]T) -> T {…}
Performs a reduction of a #simd
vector a
, returning the result as a scalar. The return type matches the element-type T
of the #simd
vector input. See the following pseudocode:
simd_reduce_max :: proc(v: #simd[N]T) -> T { result := simd_extract(v, 0) for i in 1..<N { e := simd_extract(v, i) result = max(result, e) } return result }
simd_reduce_and ¶
simd_reduce_and :: proc(a: #simd[N]T) -> T {…}
Performs a reduction of a #simd
vector a
, returning the result as a scalar. The return type matches the element-type T
of the #simd
vector input. See the following pseudocode:
simd_reduce_and :: proc(v: #simd[N]T) -> T { result := simd_extract(v, 0) for i in 1..<N { e := simd_extract(v, i) result = result & e } return result }
simd_reduce_or ¶
simd_reduce_or :: proc(a: #simd[N]T) -> T {…}
Performs a reduction of a #simd
vector a
, returning the result as a scalar. The return type matches the element-type T
of the #simd
vector input. See the following pseudocode:
simd_reduce_or :: proc(v: #simd[N]T) -> T { result := simd_extract(v, 0) for i in 1..<N { e := simd_extract(v, i) result = result | e } return result }
simd_reduce_xor ¶
simd_reduce_xor :: proc(a: #simd[N]T) -> T {…}
Performs a reduction of a #simd
vector a
, returning the result as a scalar. The return type matches the element-type T
of the #simd
vector input. See the following pseudocode:
simd_reduce_xor :: proc(v: #simd[N]T) -> T { result := simd_extract(v, 0) for i in 1..<N { e := simd_extract(v, i) result = result ~ e } return result }
simd_reduce_any ¶
simd_reduce_any :: proc(a: #simd[N]T) -> T where type_is_boolean(T) {…}
simd_reduce_all ¶
simd_reduce_all :: proc(a: #simd[N]T) -> T where type_is_boolean(T) {…}
simd_gather ¶
simd_gather :: proc(ptr: #simd[N]rawptr, val: #simd[N]T, mask: #simd[N]U) -> #simd[N]T where type_is_integer(U) || type_is_boolean(U) {…}
simd_scatter ¶
simd_scatter :: proc(ptr: rawptr, val: #simd[N]T, mask: #simd[N]U) where type_is_integer(U) || type_is_boolean(U) {…}
simd_masked_load ¶
simd_masked_load :: proc(ptr: rawptr, val: #simd[N]T, mask: #simd[N]U) -> #simd[N]T where type_is_integer(U) || type_is_boolean(U) {…}
simd_masked_store ¶
simd_masked_store :: proc(ptr: rawptr, val: #simd[N]T, mask: #simd[N]U) where type_is_integer(U) || type_is_boolean(U) {…}
simd_masked_expand_load ¶
simd_masked_expand_load :: proc(ptr: rawptr, val: #simd[N]T, mask: #simd[N]U) -> #simd[N]T where type_is_integer(U) || type_is_boolean(U) {…}
simd_masked_compress_store ¶
simd_masked_compress_store :: proc(ptr: rawptr, val: #simd[N]T, mask: #simd[N]U) where type_is_integer(U) || type_is_boolean(U) {…}
simd_shuffle ¶
simd_shuffle :: proc(a, b: #simd[N]T, $indices: ..int) -> #simd[len(indices)]T {…}
The first two operators of simd_shuffle
are #simd
vectors of the same type. The indices following these represent the shuffle mask values. The mask elements must be constant integers. The result of the procedure is a vector whose length is the same as the number of indices passed to the procedure type.
The elements of the two input #simd
vectors are numbers from left to right across both of the vectors. For each element of the result #simd
vector, the shuffle indices selement an element from one of the two input vectors to copy to the result.
Example:
a, b: #simd[4]T = ...
x: #simd[4]T = intrinsics.simd_shuffle(a, b, 0, 1, 2, 3) // identity shuffle of `a`
y: #simd[4]T = intrinsics.simd_shuffle(a, b, 4, 5, 6, 7) // identity shuffle of `b`
z: #simd[4]T = intrinsics.simd_shuffle(a, b, 0, 4, 1, 5)
w: #simd[8]T = intrinsics.simd_shuffle(a, b, 0, 1, 2, 3, 4, 5, 6, 7)
v: #simd[6]T = intrinsics.simd_shuffle(a, b, 0, 1, 0, 3, 0, 4) // repeated indices and different sized vector
simd_select ¶
simd_select :: proc(cond: #simd[N]boolean_or_integer, true, false: #simd[N]T) -> #simd[N]T {…}
simd_nearest ¶
simd_nearest :: proc(a: #simd[N]any_float) -> #simd[N]any_float {…}
rounding to the nearest integral value; if two values are equally near, rounds to the even one
simd_to_bits ¶
simd_to_bits :: proc(v: #simd[N]T) -> #simd[N]Integer where size_of(T) == size_of(Integer), type_is_unsigned(Integer) {…}
simd_lanes_reverse ¶
simd_lanes_reverse :: proc(a: #simd[N]T) -> #simd[N]T {…}
equivalent a swizzle with descending indices, e.g. reserve(a, 3, 2, 1, 0)
simd_lanes_rotate_left ¶
simd_lanes_rotate_left :: proc(a: #simd[N]T, $offset: int) -> #simd[N]T {…}
simd_lanes_rotate_right ¶
simd_lanes_rotate_right :: proc(a: #simd[N]T, $offset: int) -> #simd[N]T {…}
has_target_feature ¶
has_target_feature :: proc($test: $T) -> bool where type_is_string(T) || type_is_proc(T) {…}
Checks if the current target supports the given target features.
Takes a constant comma-separated string (eg: "sha512,sse4.1"), or a procedure type which has either @(require_target_feature)
or @(enable_target_feature)
as its input and returns a boolean indicating if all listed features are supported.
procedure_of ¶
procedure_of :: proc(x: $T) -> T where type_is_proc(T) {…}
Returns the value of the procedure where x
must be a call expression.
wasm_memory_atomic_wait32 ¶
timeout_ns
is maximum number of nanoseconds the calling thread will be blocked for
A negative value will be blocked forever
Return value:
0 - indicates that the thread blocked and then was woken up
1 - the loaded value from ptr
did not match expected
, the thread did not block
2 - the thread blocked, but the timeout
wasm_memory_atomic_notify32 ¶
timeout_ns
is maximum number of nanoseconds the calling thread will be blocked for
A negative value will be blocked forever
Return value:
0 - indicates that the thread blocked and then was woken up
1 - the loaded value from ptr
did not match expected
, the thread did not block
2 - the thread blocked, but the timeout
x86_cpuid ¶
x86 Targets Only (i386, amd64)
Implements the cpuid
instruction.
x86_xgetbv ¶
x86 Targets Only (i386, amd64)
Implements in xgetbv
instruction.
objc_find_selector ¶
Darwin targets only Will return a run-time cached selector value for the given constant string value.
objc_register_selector ¶
Darwin targets only Will register a selector value at run-time for the given constant string value.
objc_find_class ¶
objc_find_class :: proc($name: string) -> objc_Class {…}
Darwin targets only Will return a run-time cached class value for the given constant string value.
objc_register_class ¶
objc_register_class :: proc($name: string) -> objc_Class {…}
Darwin targets only Will register a class value at run-time for the given constant string value.