147 releases

0.1.156 Apr 22, 2025
0.1.152 Mar 20, 2025
0.1.140 Dec 26, 2024
0.1.139 Nov 3, 2024
0.1.2 Nov 26, 2018

#53 in Rust patterns

Download history 216431/week @ 2025-01-11 196750/week @ 2025-01-18 186198/week @ 2025-01-25 205353/week @ 2025-02-01 198791/week @ 2025-02-08 213312/week @ 2025-02-15 227435/week @ 2025-02-22 229554/week @ 2025-03-01 220446/week @ 2025-03-08 207889/week @ 2025-03-15 220657/week @ 2025-03-22 216821/week @ 2025-03-29 225484/week @ 2025-04-05 199696/week @ 2025-04-12 219012/week @ 2025-04-19 176080/week @ 2025-04-26

857,118 downloads per month
Used in 92 crates (87 directly)

MIT AND Apache-2…

1MB
21K SLoC

Rust 19K SLoC // 0.2% comments GNU Style Assembly 3K SLoC

compiler-builtins

This crate provides external symbols that the compiler expects to be available when building Rust projects, typically software routines for basic operations that do not have hardware support. It is largely a port of LLVM's compiler-rt.

It is distributed as part of Rust's sysroot. compiler-builtins does not need to be added as an explicit dependency in Cargo.toml.

Contributing

See CONTRIBUTING.md.

Progress

  • aarch64/chkstk.S
  • adddf3.c
  • addsf3.c
  • arm/addsf3.S
  • arm/aeabi_dcmp.S
  • arm/aeabi_fcmp.S
  • arm/aeabi_idivmod.S
  • arm/aeabi_ldivmod.S
  • arm/aeabi_memcpy.S
  • arm/aeabi_memmove.S
  • arm/aeabi_memset.S
  • arm/aeabi_uidivmod.S
  • arm/aeabi_uldivmod.S
  • arm/chkstk.S
  • arm/divmodsi4.S (generic version is done)
  • arm/divsi3.S (generic version is done)
  • arm/modsi3.S (generic version is done)
  • arm/softfloat-alias.list
  • arm/udivmodsi4.S (generic version is done)
  • arm/udivsi3.S (generic version is done)
  • arm/umodsi3.S (generic version is done)
  • ashldi3.c
  • ashrdi3.c
  • avr/divmodhi4.S
  • avr/divmodqi4.S
  • avr/mulhi3.S
  • avr/mulqi3.S
  • avr/udivmodhi4.S
  • avr/udivmodqi4.S
  • bswapdi2.c
  • bswapsi2.c
  • bswapti2.c
  • clzdi2.c
  • clzsi2.c
  • clzti2.c
  • comparedf2.c
  • comparesf2.c
  • ctzdi2.c
  • ctzsi2.c
  • ctzti2.c
  • divdf3.c
  • divdi3.c
  • divmoddi4.c
  • divmodsi4.c
  • divmodti4.c
  • divsf3.c
  • divsi3.c
  • extendsfdf2.c
  • fixdfdi.c
  • fixdfsi.c
  • fixsfdi.c
  • fixsfsi.c
  • fixunsdfdi.c
  • fixunsdfsi.c
  • fixunssfdi.c
  • fixunssfsi.c
  • floatdidf.c
  • floatdisf.c
  • floatsidf.c
  • floatsisf.c
  • floatundidf.c
  • floatundisf.c
  • floatunsidf.c
  • floatunsisf.c
  • i386/ashldi3.S
  • i386/ashrdi3.S
  • i386/chkstk.S
  • i386/divdi3.S
  • i386/lshrdi3.S
  • i386/moddi3.S
  • i386/muldi3.S
  • i386/udivdi3.S
  • i386/umoddi3.S
  • lshrdi3.c
  • moddi3.c
  • modsi3.c
  • muldf3.c
  • muldi3.c
  • mulodi4.c
  • mulosi4.c
  • mulsf3.c
  • powidf2.c
  • powisf2.c
  • riscv/muldi3.S
  • riscv/mulsi3.S
  • subdf3.c
  • subsf3.c
  • truncdfsf2.c
  • udivdi3.c
  • udivmoddi4.c
  • udivmodsi4.c
  • udivsi3.c
  • umoddi3.c
  • umodsi3.c
  • x86_64/chkstk.S

These builtins are needed to support 128-bit integers.

  • ashlti3.c
  • ashrti3.c
  • divti3.c
  • fixdfti.c
  • fixsfti.c
  • fixunsdfti.c
  • fixunssfti.c
  • floattidf.c
  • floattisf.c
  • floatuntidf.c
  • floatuntisf.c
  • lshrti3.c
  • modti3.c
  • muloti4.c
  • multi3.c
  • udivmodti4.c
  • udivti3.c
  • umodti3.c

These builtins are needed to support f16 and f128, which are in the process of being added to Rust.

  • addtf3.c
  • comparetf2.c
  • divtf3.c
  • extenddftf2.c
  • extendhfsf2.c
  • extendhftf2.c
  • extendsftf2.c
  • fixtfdi.c
  • fixtfsi.c
  • fixtfti.c
  • fixunstfdi.c
  • fixunstfsi.c
  • fixunstfti.c
  • floatditf.c
  • floatsitf.c
  • floattitf.c
  • floatunditf.c
  • floatunsitf.c
  • floatuntitf.c
  • multf3.c
  • powitf2.c
  • subtf3.c
  • truncdfhf2.c
  • truncsfhf2.c
  • trunctfdf2.c
  • trunctfhf2.c
  • trunctfsf2.c

These builtins are used by the Hexagon DSP

  • hexagon/common_entry_exit_abi1.S
  • hexagon/common_entry_exit_abi2.S
  • hexagon/common_entry_exit_legacy.S
  • hexagon/dfaddsub.S~~
  • hexagon/dfdiv.S~~
  • hexagon/dffma.S~~
  • hexagon/dfminmax.S~~
  • hexagon/dfmul.S~~
  • hexagon/dfsqrt.S~~
  • hexagon/divdi3.S~~
  • hexagon/divsi3.S~~
  • hexagon/fastmath2_dlib_asm.S~~
  • hexagon/fastmath2_ldlib_asm.S~~
  • hexagon/fastmath_dlib_asm.S~~
  • hexagon/memcpy_forward_vp4cp4n2.S~~
  • hexagon/memcpy_likely_aligned.S~~
  • hexagon/moddi3.S~~
  • hexagon/modsi3.S~~
  • hexagon/sfdiv_opt.S~~
  • hexagon/sfsqrt_opt.S~~
  • hexagon/udivdi3.S~~
  • hexagon/udivmoddi4.S~~
  • hexagon/udivmodsi4.S~~
  • hexagon/udivsi3.S~~
  • hexagon/umoddi3.S~~
  • hexagon/umodsi3.S~~

Unimplemented functions

These builtins are for x87 f80 floating-point numbers that are not supported by Rust.

  • extendxftf2.c
  • fixunsxfdi.c
  • fixunsxfsi.c
  • fixunsxfti.c
  • fixxfdi.c
  • fixxfti.c
  • floatdixf.c
  • floattixf.c
  • floatundixf.c
  • floatuntixf.c
  • i386/floatdixf.S
  • i386/floatundixf.S
  • x86_64/floatdixf.c
  • x86_64/floatundixf.S

These builtins are for IBM "extended double" non-IEEE 128-bit floating-point numbers.

  • ppc/divtc3.c
  • ppc/fixtfdi.c
  • ppc/fixtfti.c
  • ppc/fixunstfdi.c
  • ppc/fixunstfti.c
  • ppc/floatditf.c
  • ppc/floattitf.c
  • ppc/floatunditf.c
  • ppc/gcc_qadd.c
  • ppc/gcc_qdiv.c
  • ppc/gcc_qmul.c
  • ppc/gcc_qsub.c
  • ppc/multc3.c

These builtins are for 16-bit brain floating-point numbers that are not supported by Rust.

  • truncdfbf2.c
  • truncsfbf2.c
  • trunctfxf2.c

These builtins involve complex floating-point types that are not supported by Rust.

  • divdc3.c
  • divsc3.c
  • divtc3.c
  • divxc3.c
  • muldc3.c
  • mulsc3.c
  • multc3.c
  • mulxc3.c
  • powixf2.c

These builtins are never called by LLVM.

  • absvdi2.c
  • absvsi2.c
  • absvti2.c
  • addvdi3.c
  • addvsi3.c
  • addvti3.c
  • arm/aeabi_cdcmp.S
  • arm/aeabi_cdcmpeq_check_nan.c
  • arm/aeabi_cfcmp.S
  • arm/aeabi_cfcmpeq_check_nan.c
  • arm/aeabi_div0.c
  • arm/aeabi_drsub.c
  • arm/aeabi_frsub.c
  • arm/aeabi_memcmp.S
  • arm/bswapdi2.S
  • arm/bswapsi2.S
  • arm/clzdi2.S
  • arm/clzsi2.S
  • arm/comparesf2.S
  • arm/restore_vfp_d8_d15_regs.S
  • arm/save_vfp_d8_d15_regs.S
  • arm/switch16.S
  • arm/switch32.S
  • arm/switch8.S
  • arm/switchu8.S
  • cmpdi2.c
  • cmpti2.c
  • ffssi2.c
  • ffsdi2.c - this is called by gcc though!
  • ffsti2.c
  • mulvdi3.c
  • mulvsi3.c
  • mulvti3.c
  • negdf2.c
  • negdi2.c
  • negsf2.c
  • negti2.c
  • negvdi2.c
  • negvsi2.c
  • negvti2.c
  • paritydi2.c
  • paritysi2.c
  • parityti2.c
  • popcountdi2.c
  • popcountsi2.c
  • popcountti2.c
  • ppc/restFP.S
  • ppc/saveFP.S
  • subvdi3.c
  • subvsi3.c
  • subvti3.c
  • ucmpdi2.c
  • ucmpti2.c
  • udivmodti4.c

Rust only exposes atomic types on platforms that support them, and therefore does not need to fall back to software implementations.

  • arm/sync_fetch_and_add_4.S
  • arm/sync_fetch_and_add_8.S
  • arm/sync_fetch_and_and_4.S
  • arm/sync_fetch_and_and_8.S
  • arm/sync_fetch_and_max_4.S
  • arm/sync_fetch_and_max_8.S
  • arm/sync_fetch_and_min_4.S
  • arm/sync_fetch_and_min_8.S
  • arm/sync_fetch_and_nand_4.S
  • arm/sync_fetch_and_nand_8.S
  • arm/sync_fetch_and_or_4.S
  • arm/sync_fetch_and_or_8.S
  • arm/sync_fetch_and_sub_4.S
  • arm/sync_fetch_and_sub_8.S
  • arm/sync_fetch_and_umax_4.S
  • arm/sync_fetch_and_umax_8.S
  • arm/sync_fetch_and_umin_4.S
  • arm/sync_fetch_and_umin_8.S
  • arm/sync_fetch_and_xor_4.S
  • arm/sync_fetch_and_xor_8.S
  • arm/sync_synchronize.S
  • atomic.c
  • atomic_flag_clear.c
  • atomic_flag_clear_explicit.c
  • atomic_flag_test_and_set.c
  • atomic_flag_test_and_set_explicit.c
  • atomic_signal_fence.c
  • atomic_thread_fence.c

Miscellaneous functionality that is not used by Rust.

  • aarch64/fp_mode.c
  • aarch64/lse.S (LSE atomics)
  • aarch64/sme-abi-init.c (matrix extension)
  • aarch64/sme-abi.S (matrix extension)
  • aarch64/sme-libc-routines.c (matrix extension)
  • apple_versioning.c
  • arm/fp_mode.c
  • avr/exit.S
  • clear_cache.c
  • cpu_model/aarch64.c
  • cpu_model/x86.c
  • crtbegin.c
  • crtend.c
  • emutls.c
  • enable_execute_stack.c
  • eprintf.c
  • fp_mode.c (float exception handling)
  • gcc_personality_v0.c
  • i386/fp_mode.c
  • int_util.c
  • loongarch/fp_mode.c
  • os_version_check.c
  • riscv/fp_mode.c
  • riscv/restore.S (callee-saved registers)
  • riscv/save.S (callee-saved registers)
  • trampoline_setup.c
  • ve/grow_stack.S
  • ve/grow_stack_align.S

Floating-point implementations of builtins that are only called from soft-float code. It would be better to simply use the generic soft-float versions in this case.

  • i386/floatdidf.S
  • i386/floatdisf.S
  • i386/floatundidf.S
  • i386/floatundisf.S
  • x86_64/floatundidf.S
  • x86_64/floatundisf.S
  • x86_64/floatdidf.c
  • x86_64/floatdisf.c

Unsupported in any current target: used on old versions of 32-bit iOS with ARMv5.

  • arm/adddf3vfp.S
  • arm/addsf3vfp.S
  • arm/divdf3vfp.S
  • arm/divsf3vfp.S
  • arm/eqdf2vfp.S
  • arm/eqsf2vfp.S
  • arm/extendsfdf2vfp.S
  • arm/fixdfsivfp.S
  • arm/fixsfsivfp.S
  • arm/fixunsdfsivfp.S
  • arm/fixunssfsivfp.S
  • arm/floatsidfvfp.S
  • arm/floatsisfvfp.S
  • arm/floatunssidfvfp.S
  • arm/floatunssisfvfp.S
  • arm/gedf2vfp.S
  • arm/gesf2vfp.S
  • arm/gtdf2vfp.S
  • arm/gtsf2vfp.S
  • arm/ledf2vfp.S
  • arm/lesf2vfp.S
  • arm/ltdf2vfp.S
  • arm/ltsf2vfp.S
  • arm/muldf3vfp.S
  • arm/mulsf3vfp.S
  • arm/nedf2vfp.S
  • arm/negdf2vfp.S
  • arm/negsf2vfp.S
  • arm/nesf2vfp.S
  • arm/subdf3vfp.S
  • arm/subsf3vfp.S
  • arm/truncdfsf2vfp.S
  • arm/unorddf2vfp.S
  • arm/unordsf2vfp.S

License

Usage is allowed under the MIT License and the Apache License, Version 2.0 with the LLVM exception.

Contribution

Contributions are licensed under the MIT License, the Apache License, Version 2.0, and the Apache-2.0 license with the LLVM exception.

See LICENSE.txt for full details.

Dependencies