Skip to content

Compiler Intrinsics #658

Open
Open
@philberty

Description

We need to support the extern "rust-intrinsics" GCC seems to have something at least pretty similar to a lot of these not 100% about all of them, things like transmute look more custom to rust.

https://github.com/rust-lang/rust/blob/master/library/core/src/intrinsics.rs
https://github.com/rust-lang/rust/blob/master/compiler/rustc_codegen_llvm/src/intrinsic.rs

  • atomic_cxchg_relaxed_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_relaxed_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_relaxed_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_acquire_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_acquire_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_acquire_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_release_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_release_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_release_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_acqrel_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_acqrel_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_acqrel_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_seqcst_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_seqcst_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchg_seqcst_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_relaxed_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_relaxed_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_relaxed_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_acquire_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_acquire_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_acquire_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_release_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_release_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_release_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_acqrel_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_acqrel_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_acqrel_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_seqcst_relaxed<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_seqcst_acquire<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_cxchgweak_seqcst_seqcst<T: Copy>(dst: *mut T, old: T, src: T) -> (T, bool);
  • atomic_load_seqcst<T: Copy>(src: *const T) -> T;
  • atomic_load_acquire<T: Copy>(src: *const T) -> T;
  • atomic_load_relaxed<T: Copy>(src: *const T) -> T;
  • atomic_load_unordered<T: Copy>(src: *const T) -> T;
  • atomic_store_seqcst<T: Copy>(dst: *mut T, val: T);
  • atomic_store_release<T: Copy>(dst: *mut T, val: T);
  • atomic_store_relaxed<T: Copy>(dst: *mut T, val: T);
  • atomic_store_unordered<T: Copy>(dst: *mut T, val: T);
  • atomic_xchg_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xchg_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xchg_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xchg_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xchg_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xadd_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xadd_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xadd_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xadd_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xadd_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xsub_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xsub_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xsub_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xsub_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xsub_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_and_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_and_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_and_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_and_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_and_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_nand_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_nand_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_nand_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_nand_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_nand_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_or_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_or_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_or_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_or_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_or_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xor_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xor_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xor_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xor_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_xor_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_max_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_max_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_max_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_max_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_max_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_min_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_min_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_min_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_min_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_min_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umin_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umin_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umin_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umin_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umin_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umax_seqcst<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umax_acquire<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umax_release<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umax_acqrel<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_umax_relaxed<T: Copy>(dst: *mut T, src: T) -> T;
  • atomic_fence_seqcst();
  • atomic_fence_acquire();
  • atomic_fence_release();
  • atomic_fence_acqrel();
  • atomic_singlethreadfence_seqcst();
  • atomic_singlethreadfence_acquire();
  • atomic_singlethreadfence_release();
  • atomic_singlethreadfence_acqrel();
  • prefetch_read_data<T>(data: *const T, locality: i32);
  • prefetch_write_data<T>(data: *const T, locality: i32);
  • prefetch_read_instruction<T>(data: *const T, locality: i32);
  • prefetch_write_instruction<T>(data: *const T, locality: i32);
  • rustc_peek<T>(_: T) -> T;
  • abort() -> !;
  • unreachable() -> !;
  • assume(b: bool); Implement assume(b: bool); intrinsic #1561
  • likely(b: bool) -> bool;
  • unlikely(b: bool) -> bool;
  • breakpoint();
  • size_of<T>() -> usize;
  • min_align_of<T>() -> usize;
  • pref_align_of<T>() -> usize;
  • size_of_val<T: ?Sized>(_: *const T) -> usize;
  • min_align_of_val<T: ?Sized>(_: *const T) -> usize;
  • type_name<T: ?Sized>() -> &'static str;
  • type_id<T: ?Sized + 'static>() -> u64;
  • assert_inhabited<T>();
  • assert_zero_valid<T>();
  • assert_uninit_valid<T>();
  • caller_location() -> &'static crate::panic::Location<'static>;
  • forget<T: ?Sized>(_: T);
  • transmute<T, U>(e: T) -> U;
  • needs_drop<T: ?Sized>() -> bool;
  • offset<T>(dst: *const T, offset: isize) -> *const T;
  • arith_offset<T>(dst: *const T, offset: isize) -> *const T;
  • volatile_copy_nonoverlapping_memory<T>(dst: *mut T, src: *const T, count: usize);
  • volatile_copy_memory<T>(dst: *mut T, src: *const T, count: usize);
  • volatile_set_memory<T>(dst: *mut T, val: u8, count: usize);
  • volatile_load<T>(src: *const T) -> T;
  • volatile_store<T>(dst: *mut T, val: T);
  • unaligned_volatile_load<T>(src: *const T) -> T;
  • unaligned_volatile_store<T>(dst: *mut T, val: T);
  • sqrtf32(x: f32) -> f32;
  • sqrtf64(x: f64) -> f64;
  • powif32(a: f32, x: i32) -> f32;
  • powif64(a: f64, x: i32) -> f64;
  • sinf32(x: f32) -> f32;
  • sinf64(x: f64) -> f64;
  • cosf32(x: f32) -> f32;
  • cosf64(x: f64) -> f64;
  • powf32(a: f32, x: f32) -> f32;
  • powf64(a: f64, x: f64) -> f64;
  • expf32(x: f32) -> f32;
  • expf64(x: f64) -> f64;
  • exp2f32(x: f32) -> f32;
  • exp2f64(x: f64) -> f64;
  • logf32(x: f32) -> f32;
  • logf64(x: f64) -> f64;
  • log10f32(x: f32) -> f32;
  • log10f64(x: f64) -> f64;
  • log2f32(x: f32) -> f32;
  • log2f64(x: f64) -> f64;
  • fmaf32(a: f32, b: f32, c: f32) -> f32;
  • fmaf64(a: f64, b: f64, c: f64) -> f64;
  • fabsf32(x: f32) -> f32;
  • fabsf64(x: f64) -> f64;
  • minnumf32(x: f32, y: f32) -> f32;
  • minnumf64(x: f64, y: f64) -> f64;
  • maxnumf32(x: f32, y: f32) -> f32;
  • maxnumf64(x: f64, y: f64) -> f64;
  • copysignf32(x: f32, y: f32) -> f32;
  • copysignf64(x: f64, y: f64) -> f64;
  • floorf32(x: f32) -> f32;
  • floorf64(x: f64) -> f64;
  • ceilf32(x: f32) -> f32;
  • ceilf64(x: f64) -> f64;
  • truncf32(x: f32) -> f32;
  • truncf64(x: f64) -> f64;
  • rintf32(x: f32) -> f32;
  • rintf64(x: f64) -> f64;
  • nearbyintf32(x: f32) -> f32;
  • nearbyintf64(x: f64) -> f64;
  • roundf32(x: f32) -> f32;
  • roundf64(x: f64) -> f64;
  • fadd_fast<T: Copy>(a: T, b: T) -> T;
  • fsub_fast<T: Copy>(a: T, b: T) -> T;
  • fmul_fast<T: Copy>(a: T, b: T) -> T;
  • fdiv_fast<T: Copy>(a: T, b: T) -> T;
  • frem_fast<T: Copy>(a: T, b: T) -> T;
  • float_to_int_unchecked<Float: Copy, Int: Copy>(value: Float) -> Int;
  • ctpop<T: Copy>(x: T) -> T;
  • ctlz<T: Copy>(x: T) -> T;
  • ctlz_nonzero<T: Copy>(x: T) -> T;
  • cttz<T: Copy>(x: T) -> T;
  • cttz_nonzero<T: Copy>(x: T) -> T;
  • bswap<T: Copy>(x: T) -> T;
  • bitreverse<T: Copy>(x: T) -> T;
  • add_with_overflow<T: Copy>(x: T, y: T) -> (T, bool);
  • sub_with_overflow<T: Copy>(x: T, y: T) -> (T, bool);
  • mul_with_overflow<T: Copy>(x: T, y: T) -> (T, bool);
  • exact_div<T: Copy>(x: T, y: T) -> T;
  • unchecked_div<T: Copy>(x: T, y: T) -> T;
  • unchecked_rem<T: Copy>(x: T, y: T) -> T;
  • unchecked_shl<T: Copy>(x: T, y: T) -> T;
  • unchecked_shr<T: Copy>(x: T, y: T) -> T;
  • unchecked_add<T: Copy>(x: T, y: T) -> T;
  • unchecked_sub<T: Copy>(x: T, y: T) -> T;
  • unchecked_mul<T: Copy>(x: T, y: T) -> T;
  • rotate_left<T: Copy>(x: T, y: T) -> T;
  • rotate_right<T: Copy>(x: T, y: T) -> T;
  • wrapping_add<T: Copy>(a: T, b: T) -> T;
  • wrapping_sub<T: Copy>(a: T, b: T) -> T;
  • wrapping_mul<T: Copy>(a: T, b: T) -> T;
  • saturating_add<T: Copy>(a: T, b: T) -> T;
  • saturating_sub<T: Copy>(a: T, b: T) -> T;
  • discriminant_value<T>(v: &T) -> <T as DiscriminantKind>::Discriminant;
  • variant_count<T>() -> usize;
  • r#try(try_fn: fn(*mut u8), data: *mut u8, catch_fn: fn(*mut u8, *mut u8)) -> i32;
  • nontemporal_store<T>(ptr: *mut T, val: T);
  • ptr_offset_from<T>(ptr: *const T, base: *const T) -> isize;
  • ptr_offset_from_unsigned<T>(ptr: *const T, base: *const T) -> usize;
  • ptr_guaranteed_eq<T>(ptr: *const T, other: *const T) -> bool;
  • ptr_guaranteed_ne<T>(ptr: *const T, other: *const T) -> bool;
  • const_allocate(size: usize, align: usize) -> *mut u8;
  • const_deallocate(ptr: *mut u8, size: usize, align: usize);
  • raw_eq<T>(a: &T, b: &T) -> bool;
  • black_box<T>(dummy: T) -> T; Add black_box intrinsic #3372
  • vtable_size(ptr: *const ()) -> usize;
  • vtable_align(ptr: *const ()) -> usize;
  • copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions