Commit 8de2f77f3b

Andrew Kelley <andrew@ziglang.org>
2023-05-12 02:39:38
remove the compiler-rt README file
What's the point of this file? It has way too much information and it attracts contribution churn. Somebody else should maintain this somewhere else.
1 parent 3c2841c
Changed files (1)
lib
compiler_rt
lib/compiler_rt/README.md
@@ -1,804 +0,0 @@
-If hardware lacks basic or specialized functionality, compiler-rt adds such functionality
-for basic arithmetic(s).
-One such example is 64-bit integer multiplication on 32-bit x86.
-
-Goals:
-1. zig as linker for object files produced by other compilers
-   => `function compatibility` to compiler-rt and libgcc for same-named functions
-   * compatibility conflict between compiler-rt and libgcc: prefer compiler-rt
-2. `symbol-level compatibility` low-priority compared to emitted calls by llvm
-   * symbol-level compatibility: libgcc even lower priority
-3. add zig-specific language runtime features, see #7265
-   * example: arbitrary bit width integer arithmetic
-   * lower to call those functions for e.g. multiplying two i12345 numbers together
-   * proper naming + documention for standardizing (allow languages to follow our exmaple)
-
-Current status (tracking libgcc documentation):
-- Integer library routines => almost implemented
-- Soft float library routines => finished
-- Decimal float library routines => unimplemented (~120 functions)
-- Fixed-point fractional library routines => unimplemented (~300 functions)
-- Exception handling routines => unclear, if supported (~32+x undocumented functions)
-- Miscellaneous routines => unclear, if supported (cache control and stack function)
-- No zig-specific language runtime features in compiler-rt yet
-
-This library is automatically built as-needed for the compilation target and
-then statically linked and therefore is a transparent dependency for the
-programmer.
-For details see `../compiler_rt.zig`.
-
-Bugs should be solved by trying to duplicate the bug upstream, if possible.
- * If the bug exists upstream, get it fixed upstream and port the fix downstream to Zig.
- * If the bug only exists in Zig, use the corresponding C code and debug
-   both implementations side by side to figure out what is wrong.
-
-Routines with status are given below. Sources were besides
-"The Art of Computer Programming" by Donald E. Knuth, "HackersDelight" by Henry S. Warren,
-"Bit Twiddling Hacks" collected by Sean Eron Anderson, "Berkeley SoftFloat" by John R. Hauser,
-LLVM "compiler-rt" as it was MIT-licensed, "musl libc" and thoughts + work of contributors.
-
-The compiler-rt routines have not yet been audited.
-See https://github.com/ziglang/zig/issues/1504.
-
-From left to right the columns mean 1. if the routine is implemented (✗ or ✓),
-2. the name, 3. input (`a`), 4. input (`b`), 5. return value,
-6. an explanation of the functionality, .. to repeat the comment from the
-column a row above and/or additional return values.
-Some routines have more extensive comments supplemented with a reference text.
-
-Integer and Float Operations
-
-| Done   | Name          | a    | b    | Out  | Comment                        |
-| ------ | ------------- | ---- | ---- | ---- | ------------------------------ |
-|   |                    |      |      |      | **Integer Bit Operations**     |
-| ✓ | __clzsi2           | u32  | ∅    | i32  | count leading zeros            |
-| ✓ | __clzdi2           | u64  | ∅    | i32  | count leading zeros            |
-| ✓ | __clzti2           | u128 | ∅    | i32  | count leading zeros            |
-| ✓ | __ctzsi2           | u32  | ∅    | i32  | count trailing zeros           |
-| ✓ | __ctzdi2           | u64  | ∅    | i32  | count trailing zeros           |
-| ✓ | __ctzti2           | u128 | ∅    | i32  | count trailing zeros           |
-| ✓ | __ffssi2           | u32  | ∅    | i32  | find least significant 1 bit   |
-| ✓ | __ffsdi2           | u64  | ∅    | i32  | find least significant 1 bit   |
-| ✓ | __ffsti2           | u128 | ∅    | i32  | find least significant 1 bit   |
-| ✓ | __paritysi2        | u32  | ∅    | i32  | bit parity                     |
-| ✓ | __paritydi2        | u64  | ∅    | i32  | bit parity                     |
-| ✓ | __parityti2        | u128 | ∅    | i32  | bit parity                     |
-| ✓ | __popcountsi2      | u32  | ∅    | i32  | bit population                 |
-| ✓ | __popcountdi2      | u64  | ∅    | i32  | bit population                 |
-| ✓ | __popcountti2      | u128 | ∅    | i32  | bit population                 |
-| ✓ | __bswapsi2         | u32  | ∅    | i32  | byte swap                      |
-| ✓ | __bswapdi2         | u64  | ∅    | i32  | byte swap                      |
-| ✓ | __bswapti2         | u128 | ∅    | i32  | byte swap                      |
-|   |                    |      |      |      | **Integer Comparison**         |
-| ✓ | __cmpsi2           | i32  | i32  | i32  | `(a<b) -> 0, (a==b) -> 1, (a>b) -> 2` |
-| ✓ | __cmpdi2           | i64  | i64  | i32  | ..                             |
-| ✗ | __aeabi_lcmp       | i64  | i64  | i32  | .. ARM                         |
-| ✓ | __cmpti2           | i128 | i128 | i32  | ..                             |
-| ✓ | __ucmpsi2          | u32  | u32  | i32  | `(a<b) -> 0, (a==b) -> 1, (a>b) -> 2` |
-| ✓ | __ucmpdi2          | u64  | u64  | i32  | ..                             |
-| ✗ | __aeabi_ulcmp      | u64  | u64  | i32  | .. ARM                         |
-| ✓ | __ucmpti2          | u128 | u128 | i32  | ..                             |
-|   |                    |      |      |      | **Integer Arithmetic**         |
-| ✓ | __ashlsi3          | i32  | i32  | i32  | `a << b` [^unused_rl78]        |
-| ✓ | __ashldi3          | i64  | i32  | i64  | ..                             |
-| ✓ | __ashlti3          | i128 | i32  | i128 | ..                             |
-| ✓ | __aeabi_llsl       | i32  | i32  | i32  | .. ARM                         |
-| ✓ | __ashrsi3          | i32  | i32  | i32  | `a >> b` arithmetic (sign fill) [^unused_rl78] |
-| ✓ | __ashrdi3          | i64  | i32  | i64  | ..                             |
-| ✓ | __ashrti3          | i128 | i32  | i128 | ..                             |
-| ✓ | __aeabi_lasr       | i64  | i32  | i64  | .. ARM                         |
-| ✓ | __lshrsi3          | i32  | i32  | i32  | `a >> b` logical (zero fill) [^unused_rl78] |
-| ✓ | __lshrdi3          | i64  | i32  | i64  | ..                             |
-| ✓ | __lshrti3          | i128 | i32  | i128 | ..                             |
-| ✓ | __aeabi_llsr       | i64  | i32  | i64  | .. ARM                         |
-| ✓ | __negsi2           | i32  | i32  | i32  | `-a` [^libgcc_compat]          |
-| ✓ | __negdi2           | i64  | i64  | i64  | ..                             |
-| ✓ | __negti2           | i128 | i128 | i128 | ..                             |
-| ✓ | __mulsi3           | i32  | i32  | i32  | `a * b`                        |
-| ✓ | __muldi3           | i64  | i64  | i64  | ..                             |
-| ✓ | __aeabi_lmul       | i64  | i64  | i64  | .. ARM                         |
-| ✓ | __multi3           | i128 | i128 | i128 | ..                             |
-| ✓ | __divsi3           | i32  | i32  | i32  | `a / b`                        |
-| ✓ | __divdi3           | i64  | i64  | i64  | ..                             |
-| ✓ | __divti3           | i128 | i128 | i128 | ..                             |
-| ✓ | __aeabi_idiv       | i32  | i32  | i32  | .. ARM                         |
-| ✓ | __udivsi3          | u32  | u32  | u32  | `a / b`                        |
-| ✓ | __udivdi3          | u64  | u64  | u64  | ..                             |
-| ✓ | __udivti3          | u128 | u128 | u128 | ..                             |
-| ✓ | __aeabi_uidiv      | i32  | i32  | i32  | .. ARM                         |
-| ✓ | __modsi3           | i32  | i32  | i32  | `a % b`                        |
-| ✓ | __moddi3           | i64  | i64  | i64  | ..                             |
-| ✓ | __modti3           | i128 | i128 | i128 | ..                             |
-| ✓ | __umodsi3          | u32  | u32  | u32  | `a % b`                        |
-| ✓ | __umoddi3          | u64  | u64  | u64  | ..                             |
-| ✓ | __umodti3          | u128 | u128 | u128 | ..                             |
-| ✓ | __udivmodsi4       | u32  | u32  | u32  | `a / b, rem.* = a % b`         |
-| ✓ | __aeabi_uidivmod   | u32  | u32  | u32  | .. ARM                         |
-| ✓ | __udivmoddi4       | u64  | u64  | u64  | ..                             |
-| ✓ | __aeabi_uldivmod   | u64  | u64  | u64  | .. ARM                         |
-| ✓ | __udivmodti4       | u128 | u128 | u128 | ..                             |
-| ✓ | __divmodsi4        | i32  | i32  | i32  | `a / b, rem.* = a % b`         |
-| ✓ | __aeabi_idivmod    | i32  | i32  | i32  | .. ARM                         |
-| ✓ | __divmoddi4        | i64  | i64  | i64  | ..                             |
-| ✓ | __aeabi_ldivmod    | i64  | i64  | i64  | .. ARM                         |
-| ✓ | __divmodti4        | i128 | i128 | i128 | .. [^libgcc_compat]            |
-|   |                    |      |      |      | **Integer Arithmetic with Trapping Overflow**|
-| ✓ | __absvsi2          | i32  | i32  | i32  | abs(a)                         |
-| ✓ | __absvdi2          | i64  | i64  | i64  | ..                             |
-| ✓ | __absvti2          | i128 | i128 | i128 | ..                             |
-| ✓ | __negvsi2          | i32  | i32  | i32  | `-a` [^libgcc_compat]          |
-| ✓ | __negvdi2          | i64  | i64  | i64  | ..                             |
-| ✓ | __negvti2          | i128 | i128 | i128 | ..                             |
-| ✗ | __addvsi3          | i32  | i32  | i32  | `a + b`                        |
-| ✗ | __addvdi3          | i64  | i64  | i64  | ..                             |
-| ✗ | __addvti3          | i128 | i128 | i128 | ..                             |
-| ✗ | __subvsi3          | i32  | i32  | i32  | `a - b`                        |
-| ✗ | __subvdi3          | i64  | i64  | i64  | ..                             |
-| ✗ | __subvti3          | i128 | i128 | i128 | ..                             |
-| ✗ | __mulvsi3          | i32  | i32  | i32  | `a * b`                        |
-| ✗ | __mulvdi3          | i64  | i64  | i64  | ..                             |
-| ✗ | __mulvti3          | i128 | i128 | i128 | ..                             |
-|   |                    |      |      |      | **Integer Arithmetic which Return on Overflow** [^noptr_faster] |
-| ✓ | __addosi4          | i32  | i32  | i32  | `a + b`, overflow->ov.*=1 else 0 [^perf_addition] |
-| ✓ | __addodi4          | i64  | i64  | i64  | ..                             |
-| ✓ | __addoti4          | i128 | i128 | i128 | ..                             |
-| ✓ | __subosi4          | i32  | i32  | i32  | `a - b`, overflow->ov.*=1 else 0 [^perf_addition] |
-| ✓ | __subodi4          | i64  | i64  | i64  | ..                             |
-| ✓ | __suboti4          | i128 | i128 | i128 | ..                             |
-| ✓ | __mulosi4          | i32  | i32  | i32  | `a * b`, overflow->ov.*=1 else 0 |
-| ✓ | __mulodi4          | i64  | i64  | i64  | ..                             |
-| ✓ | __muloti4          | i128 | i128 | i128 | ..                             |
-|   |                    |      |      |      | **Float Conversion**           |
-| ✓ | __extendhfdf2      | f16  | ∅    | f32  | ..                             |
-| ✓ | __extendsfdf2      | f32  | ∅    | f64  | ..                             |
-| ✓ | __aeabi_f2d        | f32  | ∅    | f64  | ..                             |
-| ✓ | __extendsftf2      | f32  | ∅    | f128 | ..                             |
-| ✓ | __extendsfxf2      | f32  | ∅    | f80  | ..                             |
-| ✓ | __extenddftf2      | f64  | ∅    | f128 | ..                             |
-| ✓ | __extenddfxf2      | f64  | ∅    | f80  | ..                             |
-| ✗ | __aeabi_h2f        | f16  | ∅    | f32  | .. ARM                         |
-| ✗ | __aeabi_h2f_alt    | f16  | ∅    | f32  | .. ARM alternate [^VFPv3alt]   |
-| ✓ | __gnu_h2f_ieee     | f16  | ∅    | f32  | .. GNU naming convention       |
-| ✓ | __truncsfhf2       | f32  | ∅    | f16  | rounding towards zero          |
-| ✓ | __truncdfhf2       | f64  | ∅    | f16  | ..                             |
-| ✓ | __truncdfsf2       | f64  | ∅    | f32  | ..                             |
-| ✓ | __trunctfhf2       | f128 | ∅    | f16  | ..                             |
-| ✓ | __trunctfsf2       | f128 | ∅    | f32  | ..                             |
-| ✓ | __trunctfdf2       | f128 | ∅    | f64  | ..                             |
-| ✓ | __trunctfxf2       | f128 | ∅    | f80  | ..                             |
-| ✓ | __truncxfhf2       | f80  | ∅    | f16  | ..                             |
-| ✓ | __truncxfsf2       | f80  | ∅    | f32  | ..                             |
-| ✓ | __truncxfdf2       | f80  | ∅    | f64  | ..                             |
-| ✗ | __aeabi_f2h        | f32  | ∅    | f16  | .. ARM                         |
-| ✗ | __aeabi_f2h_alt    | f32  | ∅    | f16  | .. ARM alternate [^VFPv3alt]   |
-| ✓ | __gnu_f2h_ieee     | f32  | ∅    | f16  | .. GNU naming convention       |
-| ✓ | __aeabi_d2h        | f64  | ∅    | f16  | .. ARM                         |
-| ✗ | __aeabi_d2h_alt    | f64  | ∅    | f16  | .. ARM alternate [^VFPv3alt]   |
-| ✓ | __aeabi_d2f        | f64  | ∅    | f32  | .. ARM                         |
-| ✓ | __trunckfsf2       | f128 | ∅    | f32  | .. PPC                         |
-| ✓ | _Qp_qtos           |*f128 | ∅    | f32  | .. SPARC                       |
-| ✓ | __trunckfdf2       | f128 | ∅    | f64  | .. PPC                         |
-| ✓ | _Qp_qtod           |*f128 | ∅    | f64  | .. SPARC                       |
-| ✓ | __fixhfsi          | f16  | ∅    | i32  | float to int, rounding towards zero |
-| ✓ | __fixsfsi          | f32  | ∅    | i32  | ..                             |
-| ✓ | __aeabi_f2iz       | f32  | ∅    | i32  | .. ARM                         |
-| ✓ | __fixdfsi          | f64  | ∅    | i32  | ..                             |
-| ✓ | __aeabi_d2iz       | f64  | ∅    | i32  | .. ARM                         |
-| ✓ | __fixtfsi          | f128 | ∅    | i32  | ..                             |
-| ✓ | __fixxfsi          | f80  | ∅    | i32  | ..                             |
-| ✓ | __fixhfdi          | f16  | ∅    | i64  | ..                             |
-| ✓ | __fixsfdi          | f32  | ∅    | i64  | ..                             |
-| ✓ | __aeabi_f2lz       | f32  | ∅    | i64  | .. ARM                         |
-| ✓ | __fixdfdi          | f64  | ∅    | i64  | ..                             |
-| ✓ | __aeabi_d2lz       | f64  | ∅    | i64  | .. ARM                         |
-| ✓ | __fixtfdi          | f128 | ∅    | i64  | ..                             |
-| ✓ | __fixxfdi          | f80  | ∅    | i64  | ..                             |
-| ✓ | __fixhfti          | f16  | ∅    | i128 | ..                             |
-| ✓ | __fixsfti          | f32  | ∅    | i128 | ..                             |
-| ✓ | __fixdfti          | f64  | ∅    | i128 | ..                             |
-| ✓ | __fixtfti          | f128 | ∅    | i128 | ..                             |
-| ✓ | __fixxfti          | f80  | ∅    | i128 | ..                             |
-| ✓ | __fixunshfsi       | f16  | ∅    | u32  | float to uint, rounding towards zero. negative values become 0. |
-| ✓ | __fixunssfsi       | f32  | ∅    | u32  | ..                             |
-| ✓ | __aeabi_f2uiz      | f32  | ∅    | u32  | .. ARM                         |
-| ✓ | __fixunsdfsi       | f64  | ∅    | u32  | ..                             |
-| ✓ | __aeabi_d2uiz      | f64  | ∅    | u32  | .. ARM                         |
-| ✓ | __fixunstfsi       | f128 | ∅    | u32  | ..                             |
-| ✓ | __fixunsxfsi       | f80  | ∅    | u32  | ..                             |
-| ✓ | __fixunshfdi       | f16  | ∅    | u64  | ..                             |
-| ✓ | __fixunssfdi       | f32  | ∅    | u64  | ..                             |
-| ✓ | __aeabi_f2ulz      | f32  | ∅    | u64  | .. ARM                         |
-| ✓ | __fixunsdfdi       | f64  | ∅    | u64  | ..                             |
-| ✓ | __aeabi_d2ulz      | f64  | ∅    | u64  | .. ARM                         |
-| ✓ | __fixunstfdi       | f128 | ∅    | u64  | ..                             |
-| ✓ | __fixunsxfdi       | f80  | ∅    | u64  | ..                             |
-| ✓ | __fixunshfti       | f16  | ∅    | u128 | ..                             |
-| ✓ | __fixunssfti       | f32  | ∅    | u128 | ..                             |
-| ✓ | __fixunsdfti       | f64  | ∅    | u128 | ..                             |
-| ✓ | __fixunstfti       | f128 | ∅    | u128 | ..                             |
-| ✓ | __fixunsxfti       | f80  | ∅    | u128 | ..                             |
-| ✓ | __floatsihf        | i32  | ∅    | f16  | int to float                   |
-| ✓ | __floatsisf        | i32  | ∅    | f32  | ..                             |
-| ✓ | __aeabi_i2f        | i32  | ∅    | f32  | .. ARM                         |
-| ✓ | __floatsidf        | i32  | ∅    | f64  | ..                             |
-| ✓ | __aeabi_i2d        | i32  | ∅    | f64  | .. ARM                         |
-| ✓ | __floatsitf        | i32  | ∅    | f128 | ..                             |
-| ✓ | __floatsixf        | i32  | ∅    | f80  | ..                             |
-| ✓ | __floatdisf        | i64  | ∅    | f32  | ..                             |
-| ✓ | __aeabi_l2f        | i64  | ∅    | f32  | .. ARM                         |
-| ✓ | __floatdidf        | i64  | ∅    | f64  | ..                             |
-| ✓ | __aeabi_l2d        | i64  | ∅    | f64  | .. ARM                         |
-| ✓ | __floatditf        | i64  | ∅    | f128 | ..                             |
-| ✓ | __floatdixf        | i64  | ∅    | f80  | ..                             |
-| ✓ | __floattihf        | i128 | ∅    | f16  | ..                             |
-| ✓ | __floattisf        | i128 | ∅    | f32  | ..                             |
-| ✓ | __floattidf        | i128 | ∅    | f64  | ..                             |
-| ✓ | __floattitf        | i128 | ∅    | f128 | ..                             |
-| ✓ | __floattixf        | i128 | ∅    | f80  | ..                             |
-| ✓ | __floatunsihf      | u32  | ∅    | f16  | uint to float                  |
-| ✓ | __floatunsisf      | u32  | ∅    | f32  | ..                             |
-| ✓ | __aeabi_ui2f       | u32  | ∅    | f32  | .. ARM                         |
-| ✓ | __floatunsidf      | u32  | ∅    | f64  | ..                             |
-| ✓ | __aeabi_ui2d       | u32  | ∅    | f64  | .. ARM                         |
-| ✓ | __floatunsitf      | u32  | ∅    | f128 | ..                             |
-| ✓ | __floatunsixf      | u32  | ∅    | f80  | ..                             |
-| ✓ | __floatundihf      | u64  | ∅    | f16  | ..                             |
-| ✓ | __floatundisf      | u64  | ∅    | f32  | ..                             |
-| ✓ | __aeabi_ul2f       | u64  | ∅    | f32  | .. ARM                         |
-| ✓ | __floatundidf      | u64  | ∅    | f64  | ..                             |
-| ✓ | __aeabi_ul2d       | u64  | ∅    | f64  | .. ARM                         |
-| ✓ | __floatunditf      | u64  | ∅    | f128 | ..                             |
-| ✓ | __floatundixf      | u64  | ∅    | f80  | ..                             |
-| ✓ | __floatuntihf      | u128 | ∅    | f16  | ..                             |
-| ✓ | __floatuntisf      | u128 | ∅    | f32  | ..                             |
-| ✓ | __floatuntidf      | u128 | ∅    | f64  | ..                             |
-| ✓ | __floatuntitf      | u128 | ∅    | f128 | ..                             |
-| ✓ | __floatuntixf      | u128 | ∅    | f80  | ..                             |
-|   |                    |      |      |      | **Float Comparison**           |
-| ✓ | __cmphf2           | f16  | f16  | i32  | `(a<b)->-1, (a==b)->0, (a>b)->1, Nan->1` |
-| ✓ | __cmpsf2           | f32  | f32  | i32  | exported from __lesf2, __ledf2, __letf2 (below) |
-| ✓ | __cmpdf2           | f64  | f64  | i32  | But: if NaN is a possibility, use another routine. |
-| ✓ | __cmptf2           | f128 | f128 | i32  | ..                             |
-| ✓ | __cmpxf2           | f80  | f80  | i32  | ..                             |
-| ✓ | _Qp_cmp            |*f128 |*f128 | i32  | .. SPARC                       |
-| ✓ | __unordhf2         | f16  | f16  | i32  | `(a==+-NaN or b==+-NaN) -> !=0, else -> 0` |
-| ✓ | __unordsf2         | f32  | f32  | i32  | ..                             |
-| ✓ | __unorddf2         | f64  | f64  | i32  | Note: only reliable for (input!=NaN) |
-| ✓ | __unordtf2         | f128 | f128 | i32  | ..                             |
-| ✓ | __unordxf2         | f80  | f80  | i32  | ..                             |
-| ✓ | __aeabi_fcmpun     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __aeabi_dcmpun     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __unordkf2         | f128 | f128 | i32  | .. PPC                         |
-| ✓ | __eqhf2            | f16  | f16  | i32  | `(a!=NaN) and (b!=Nan) and (a==b) -> output=0` |
-| ✓ | __eqsf2            | f32  | f32  | i32  | ..                                             |
-| ✓ | __eqdf2            | f64  | f64  | i32  | ..                             |
-| ✓ | __eqtf2            | f128 | f128 | i32  | ..                             |
-| ✓ | __eqxf2            | f80  | f80  | i32  | ..                             |
-| ✓ | __aeabi_fcmpeq     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __aeabi_dcmpeq     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __eqkf2            | f128 | f128 | i32  | .. PPC                         |
-| ✓ | _Qp_feq            |*f128 |*f128 | bool | .. SPARC                       |
-| ✓ | __nehf2            | f16  | f16  | i32  | `(a==NaN) or (b==Nan) or (a!=b) -> output!=0` |
-| ✓ | __nesf2            | f32  | f32  | i32  | Note: __eqXf2 and __neXf2 have same return value |
-| ✓ | __nedf2            | f64  | f64  | i32  | ..                             |
-| ✓ | __netf2            | f128 | f128 | i32  | ..                             |
-| ✓ | __nexf2            | f80  | f80  | i32  | ..                             |
-| ✓ | __nekf2            | f128 | f128 | i32  | .. PPC                         |
-| ✓ | _Qp_fne            |*f128 |*f128 | bool | .. SPARC                       |
-| ✓ | __gehf2            | f16  | f16  | i32  | `(a!=Nan) and (b!=Nan) and (a>=b) -> output>=0` |
-| ✓ | __gesf2            | f32  | f32  | i32  | ..                             |
-| ✓ | __gedf2            | f64  | f64  | i32  | ..                             |
-| ✓ | __getf2            | f128 | f128 | i32  | ..                             |
-| ✓ | __gexf2            | f80  | f80  | i32  | ..                             |
-| ✓ | __aeabi_fcmpge     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __aeabi_dcmpge     | f64  | f64  | i32  | .. ARM                         |
-| ✓ | __gekf2            | f128 | f128 | i32  | .. PPC                         |
-| ✓ | _Qp_fge            |*f128 |*f128 | bool | .. SPARC                       |
-| ✓ | __lthf2            | f16  | f16  | i32  | `(a!=Nan) and (b!=Nan) and (a<b) -> output<0` |
-| ✓ | __ltsf2            | f32  | f32  | i32  | ..                             |
-| ✓ | __ltdf2            | f64  | f64  | i32  | ..                             |
-| ✓ | __lttf2            | f128 | f128 | i32  | ..                             |
-| ✓ | __ltxf2            | f80  | f80  | i32  | ..                             |
-| ✓ | __ltkf2            | f128 | f128 | i32  | .. PPC                         |
-| ✓ | __aeabi_fcmplt     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __aeabi_dcmplt     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | _Qp_flt            |*f128 |*f128 | bool | .. SPARC                       |
-| ✓ | __lehf2            | f16  | f16  | i32  | `(a!=Nan) and (b!=Nan) and (a<=b) -> output<=0` |
-| ✓ | __lesf2            | f32  | f32  | i32  | ..                             |
-| ✓ | __ledf2            | f64  | f64  | i32  | ..                             |
-| ✓ | __letf2            | f128 | f128 | i32  | ..                             |
-| ✓ | __lexf2            | f80  | f80  | i32  | ..                             |
-| ✓ | __aeabi_fcmple     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __aeabi_dcmple     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __lekf2            | f128 | f128 | i32  | .. PPC                         |
-| ✓ | _Qp_fle            |*f128 |*f128 | bool | .. SPARC                       |
-| ✓ | __gthf2            | f16  | f16  | i32  | `(a!=Nan) and (b!=Nan) and (a>b) -> output>0` |
-| ✓ | __gtsf2            | f32  | f32  | i32  | ..                             |
-| ✓ | __gtdf2            | f64  | f64  | i32  | ..                             |
-| ✓ | __gttf2            | f128 | f128 | i32  | ..                             |
-| ✓ | __gtxf2            | f80  | f80  | i32  | ..                             |
-| ✓ | __aeabi_fcmpgt     | f32  | f32  | i32  | .. ARM                         |
-| ✓ | __aeabi_dcmpgt     | f64  | f64  | i32  | .. ARM                         |
-| ✓ | __gtkf2            | f128 | f128 | i32  | .. PPC                         |
-| ✓ | _Qp_fgt            |*f128 |*f128 | bool | .. SPARC                       |
-|   |                    |      |      |      | **Float Arithmetic**           |
-| ✓ | __addhf3           | f32  | f32  | f32  | `a + b`                        |
-| ✓ | __addsf3           | f32  | f32  | f32  | ..                             |
-| ✓ | __adddf3           | f64  | f64  | f64  | ..                             |
-| ✓ | __addtf3           | f128 | f128 | f128 | ..                             |
-| ✓ | __addxf3           | f80  | f80  | f80  | ..                             |
-| ✓ | __aeabi_fadd       | f32  | f32  | f32  | .. ARM                         |
-| ✓ | __aeabi_dadd       | f64  | f64  | f64  | .. ARM                         |
-| ✓ | __addkf3           | f128 | f128 | f128 | .. PPC                         |
-| ✓ | _Qp_add            |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a+b   |
-| ✓ | __subhf3           | f32  | f32  | f32  | `a - b`                        |
-| ✓ | __subsf3           | f32  | f32  | f32  | ..                             |
-| ✓ | __subdf3           | f64  | f64  | f64  | ..                             |
-| ✓ | __subtf3           | f128 | f128 | f128 | ..                             |
-| ✓ | __subxf3           | f80  | f80  | f80  | ..                             |
-| ✓ | __aeabi_fsub       | f32  | f32  | f32  | .. ARM                         |
-| ✓ | __aeabi_dsub       | f64  | f64  | f64  | .. ARM                         |
-| ✓ | __subkf3           | f128 | f128 | f128 | .. PPC                         |
-| ✓ | _Qp_sub            |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a-b   |
-| ✓ | __mulhf3           | f32  | f32  | f32  | `a * b`                        |
-| ✓ | __mulsf3           | f32  | f32  | f32  | ..                             |
-| ✓ | __muldf3           | f64  | f64  | f64  | ..                             |
-| ✓ | __multf3           | f128 | f128 | f128 | ..                             |
-| ✓ | __mulxf3           | f80  | f80  | f80  | ..                             |
-| ✓ | __aeabi_fmul       | f32  | f32  | f32  | .. ARM                         |
-| ✓ | __aeabi_dmul       | f64  | f64  | f64  | .. ARM                         |
-| ✓ | __mulkf3           | f128 | f128 | f128 | .. PPC                         |
-| ✓ | _Qp_mul            |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a*b   |
-| ✓ | __divsf3           | f32  | f32  | f32  | `a / b`                        |
-| ✓ | __divdf3           | f64  | f64  | f64  | ..                             |
-| ✓ | __divtf3           | f128 | f128 | f128 | ..                             |
-| ✓ | __divxf3           | f80  | f80  | f80  | ..                             |
-| ✓ | __aeabi_fdiv       | f32  | f32  | f32  | .. ARM                         |
-| ✓ | __aeabi_ddiv       | f64  | f64  | f64  | .. ARM                         |
-| ✓ | __divkf3           | f128 | f128 | f128 | .. PPC                         |
-| ✓ | _Qp_div            |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a*b   |
-| ✓ | __negsf2           | f32  | ∅    | f32[^unused_rl78] | -a (can be lowered directly to a xor) |
-| ✓ | __negdf2           | f64  | ∅    | f64  | ..                             |
-| ✓ | __negtf2           | f128 | ∅    | f128 | ..                             |
-| ✓ | __negxf2           | f80  | ∅    | f80  | ..                             |
-|   |                    |      |      |      | **Other** |
-| ✓ | __powihf2          | f16  | i32  | f16  | `a ^ b`                        |
-| ✓ | __powisf2          | f32  | i32  | f32  | ..                             |
-| ✓ | __powidf2          | f64  | i32  | f64  | ..                             |
-| ✓ | __powitf2          | f128 | i32  | f128 | ..                             |
-| ✓ | __powixf2          | f80  | i32  | f80  | ..                             |
-| ✓ | __mulhc3           | all4 | f16  | f16  | `(a+ib) * (c+id)`              |
-| ✓ | __mulsc3           | all4 | f32  | f32  | ..                             |
-| ✓ | __muldc3           | all4 | f64  | f64  | ..                             |
-| ✓ | __multc3           | all4 | f128 | f128 | ..                             |
-| ✓ | __mulxc3           | all4 | f80  | f80  | ..                             |
-| ✓ | __divhc3           | all4 | f16  | f16  | `(a+ib) / (c+id)`              |
-| ✓ | __divsc3           | all4 | f32  | f32  | ..                             |
-| ✓ | __divdc3           | all4 | f64  | f64  | ..                             |
-| ✓ | __divtc3           | all4 | f128 | f128 | ..                             |
-| ✓ | __divxc3           | all4 | f80  | f80  | ..                             |
-
-[^unused_rl78]: Unused in LLVM, but used for example by rl78.
-[^libgcc_compat]: Unused in backends and for symbol-level compatibility with libgcc.
-[^noptr_faster]: Operations without pointer and without C struct semantics lead to better optimizations.
-[^perf_addition]: Has better performance than standard method due to 2s complement semantics.
-Not provided by LLVM and libgcc.
-[^VFPv3alt]: Converts IEEE-format to VFPv3 alternative-format.
-
-Decimal float library routines
-
-BID means Binary Integer Decimal encoding, DPD means Densely Packed Decimal encoding.
-BID should be only chosen for binary data, DPD for decimal data (ASCII, Unicode etc).
-For example the number 0.2 is not accurately representable in binary data.
-
-| Done   | Name          | a           | b         | Out       | Comment                      |
-| ------ | ------------- | ---------   | --------- | --------- | ---------------------------- |
-|   |                    |             |           |           | **Decimal Float Conversion** |
-| ✗ | __dpd_extendsddd2  |     dec32   | ∅         |     dec64 | conversion                   |
-| ✗ | __bid_extendsddd2  |     dec32   | ∅         |     dec64 | ..                           |
-| ✗ | __dpd_extendsdtd2  |     dec32   | ∅         |     dec128| ..                           |
-| ✗ | __bid_extendsdtd2  |     dec32   | ∅         |     dec128| ..                           |
-| ✗ | __dpd_extendddtd2  |     dec64   | ∅         |     dec128| ..                           |
-| ✗ | __bid_extendddtd2  |     dec64   | ∅         |     dec128| ..                           |
-| ✗ | __dpd_truncddsd2   |     dec64   | ∅         |     dec32 | ..                           |
-| ✗ | __bid_truncddsd2   |     dec64   | ∅         |     dec32 | ..                           |
-| ✗ | __dpd_trunctdsd2   |     dec128  | ∅         |     dec32 | ..                           |
-| ✗ | __bid_trunctdsd2   |     dec128  | ∅         |     dec32 | ..                           |
-| ✗ | __dpd_trunctddd2   |     dec128  | ∅         |     dec64 | ..                           |
-| ✗ | __bid_trunctddd2   |     dec128  | ∅         |     dec64 | ..                           |
-| ✗ | __dpd_extendsfdd   |     float   | ∅         |     dec64 | ..                           |
-| ✗ | __bid_extendsfdd   |     float   | ∅         |     dec64 | ..                           |
-| ✗ | __dpd_extendsftd   |     float   | ∅         |     dec128| ..                           |
-| ✗ | __bid_extendsftd   |     float   | ∅         |     dec128| ..                           |
-| ✗ | __dpd_extenddftd   |     double  | ∅         |     dec128| ..                           |
-| ✗ | __bid_extenddftd   |     double  | ∅         |     dec128| ..                           |
-| ✗ | __dpd_extendxftd   |long double  | ∅         |     dec128| ..                           |
-| ✗ | __bid_extendxftd   |long double  | ∅         |     dec128| ..                           |
-| ✗ | __dpd_truncdfsd    |     double  | ∅         |     dec32 | ..                           |
-| ✗ | __bid_truncdfsd    |     double  | ∅         |     dec32 | ..                           |
-| ✗ | __dpd_truncxfsd    |long double  | ∅         |     dec32 | ..                           |
-| ✗ | __bid_truncxfsd    |long double  | ∅         |     dec32 | ..                           |
-| ✗ | __dpd_trunctfsd    |long double  | ∅         |     dec32 | ..                           |
-| ✗ | __bid_trunctfsd    |long double  | ∅         |     dec32 | ..                           |
-| ✗ | __dpd_truncxfdd    |long double  | ∅         |     dec64 | ..                           |
-| ✗ | __bid_truncxfdd    |long double  | ∅         |     dec64 | ..                           |
-| ✗ | __dpd_trunctfdd    |long double  | ∅         |     dec64 | ..                           |
-| ✗ | __bid_trunctfdd    |long double  | ∅         |     dec64 | ..                           |
-| ✗ | __dpd_truncddsf    |     dec64   | ∅         |     float | ..                           |
-| ✗ | __bid_truncddsf    |     dec64   | ∅         |     float | ..                           |
-| ✗ | __dpd_trunctdsf    |     dec128  | ∅         |     float | ..                           |
-| ✗ | __bid_trunctdsf    |     dec128  | ∅         |     float | ..                           |
-| ✗ | __dpd_extendsddf   |     dec32   | ∅         |     double| ..                           |
-| ✗ | __bid_extendsddf   |     dec32   | ∅         |     double| ..                           |
-| ✗ | __dpd_trunctddf    |     dec128  | ∅         |     double| ..                           |
-| ✗ | __bid_trunctddf    |     dec128  | ∅         |     double| ..                           |
-| ✗ | __dpd_extendsdxf   |     dec32   | ∅         |long double| ..                           |
-| ✗ | __bid_extendsdxf   |     dec32   | ∅         |long double| ..                           |
-| ✗ | __dpd_extendddxf   |     dec64   | ∅         |long double| ..                           |
-| ✗ | __bid_extendddxf   |     dec64   | ∅         |long double| ..                           |
-| ✗ | __dpd_trunctdxf    |     dec128  | ∅         |long double| ..                           |
-| ✗ | __bid_trunctdxf    |     dec128  | ∅         |long double| ..                           |
-| ✗ | __dpd_extendsdtf   |     dec32   | ∅         |long double| ..                           |
-| ✗ | __bid_extendsdtf   |     dec32   | ∅         |long double| ..                           |
-| ✗ | __dpd_extendddtf   |     dec64   | ∅         |long double| ..                           |
-| ✗ | __bid_extendddtf   |     dec64   | ∅         |long double| ..                           |
-| ✗ | __dpd_extendsfsd   |     float   | ∅         |     dec32 | same size conversions        |
-| ✗ | __bid_extendsfsd   |     float   | ∅         |     dec32 | ..                           |
-| ✗ | __dpd_extenddfdd   |     double  | ∅         |     dec64 | ..                           |
-| ✗ | __bid_extenddfdd   |     double  | ∅         |     dec64 | ..                           |
-| ✗ | __dpd_extendtftd   |long double  | ∅         |     dec128| ..                           |
-| ✗ | __bid_extendtftd   |long double  | ∅         |     dec128| ..                           |
-| ✗ | __dpd_truncsdsf    |     dec32   | ∅         |     float | ..                           |
-| ✗ | __bid_truncsdsf    |     dec32   | ∅         |     float | ..                           |
-| ✗ | __dpd_truncdddf    |     dec64   | ∅         |     float | conversion                   |
-| ✗ | __bid_truncdddf    |     dec64   | ∅         |     float | ..                           |
-| ✗ | __dpd_trunctdtf    |     dec128  | ∅         |long double| ..                           |
-| ✗ | __bid_trunctdtf    |     dec128  | ∅         |long double| ..                           |
-| ✗ | __dpd_fixsdsi      |     dec32   | ∅         |     int   | ..                           |
-| ✗ | __bid_fixsdsi      |     dec32   | ∅         |     int   | ..                           |
-| ✗ | __dpd_fixddsi      |     dec64   | ∅         |     int   | ..                           |
-| ✗ | __bid_fixddsi      |     dec64   | ∅         |     int   | ..                           |
-| ✗ | __dpd_fixtdsi      |     dec128  | ∅         |     int   | ..                           |
-| ✗ | __bid_fixtdsi      |     dec128  | ∅         |     int   | ..                           |
-| ✗ | __dpd_fixsddi      |     dec32   | ∅         |     long  | ..                           |
-| ✗ | __bid_fixsddi      |     dec32   | ∅         |     long  | ..                           |
-| ✗ | __dpd_fixdddi      |     dec64   | ∅         |     long  | ..                           |
-| ✗ | __bid_fixdddi      |     dec64   | ∅         |     long  | ..                           |
-| ✗ | __dpd_fixtddi      |     dec128  | ∅         |     long  | ..                           |
-| ✗ | __bid_fixtddi      |     dec128  | ∅         |     long  | ..                           |
-| ✗ | __dpd_fixunssdsi   |     dec32   | ∅         |unsigned int | .. All negative values become zero. |
-| ✗ | __bid_fixunssdsi   |     dec32   | ∅         |unsigned int | ..                         |
-| ✗ | __dpd_fixunsddsi   |     dec64   | ∅         |unsigned int | ..                         |
-| ✗ | __bid_fixunsddsi   |     dec64   | ∅         |unsigned int | ..                         |
-| ✗ | __dpd_fixunstdsi   |     dec128  | ∅         |unsigned int | ..                         |
-| ✗ | __bid_fixunstdsi   |     dec128  | ∅         |unsigned int | ..                         |
-| ✗ | __dpd_fixunssddi   |     dec32   | ∅         |unsigned long| ..                         |
-| ✗ | __bid_fixunssddi   |     dec32   | ∅         |unsigned long| ..                         |
-| ✗ | __dpd_fixunsdddi   |     dec64   | ∅         |unsigned long| ..                         |
-| ✗ | __bid_fixunsdddi   |     dec64   | ∅         |unsigned long| ..                         |
-| ✗ | __dpd_fixunstddi   |     dec128  | ∅         |unsigned long| ..                         |
-| ✗ | __bid_fixunstddi   |     dec128  | ∅         |unsigned long| ..                         |
-| ✗ | __dpd_floatsisd    |     int     | ∅         |     dec32   | ..                         |
-| ✗ | __bid_floatsisd    |     int     | ∅         |     dec32   | ..                         |
-| ✗ | __dpd_floatsidd    |     int     | ∅         |     dec64   | ..                         |
-| ✗ | __bid_floatsidd    |     int     | ∅         |     dec64   | ..                         |
-| ✗ | __dpd_floatsitd    |     int     | ∅         |     dec128  | ..                         |
-| ✗ | __bid_floatsitd    |     int     | ∅         |     dec128  | ..                         |
-| ✗ | __dpd_floatdisd    |     long    | ∅         |     dec32   | ..                         |
-| ✗ | __bid_floatdisd    |     long    | ∅         |     dec32   | ..                         |
-| ✗ | __dpd_floatdidd    |     long    | ∅         |     dec64   | ..                         |
-| ✗ | __bid_floatdidd    |     long    | ∅         |     dec64   | ..                         |
-| ✗ | __dpd_floatditd    |     long    | ∅         |     dec128  | ..                         |
-| ✗ | __bid_floatditd    |     long    | ∅         |     dec128  | ..                         |
-| ✗ | __dpd_floatunssisd | unsigned int| ∅         |     dec32   | ..                         |
-| ✗ | __bid_floatunssisd | unsigned int| ∅         |     dec32   | ..                         |
-| ✗ | __dpd_floatunssidd | unsigned int| ∅         |     dec64   | ..                         |
-| ✗ | __bid_floatunssidd | unsigned int| ∅         |     dec64   | ..                         |
-| ✗ | __dpd_floatunssitd | unsigned int| ∅         |     dec128  | ..                         |
-| ✗ | __bid_floatunssitd | unsigned int| ∅         |     dec128  | ..                         |
-| ✗ | __dpd_floatunsdisd |unsigned long| ∅         |     dec32   | ..                         |
-| ✗ | __bid_floatunsdisd |unsigned long| ∅         |     dec32   | ..                         |
-| ✗ | __dpd_floatunsdidd |unsigned long| ∅         |     dec64   | ..                         |
-| ✗ | __bid_floatunsdidd |unsigned long| ∅         |     dec64   | ..                         |
-| ✗ | __dpd_floatunsditd |unsigned long| ∅         |     dec128  | ..                         |
-| ✗ | __bid_floatunsditd |unsigned long| ∅         |     dec128  | ..                         |
-|   |                |        |        |        | **Decimal Float Comparison**                            |
-| ✗ | __dpd_unordsd2 | dec32  | dec32  | c_int  | `a +-NaN or a +-NaN -> 1(nonzero), else -> 0`           |
-| ✗ | __bid_unordsd2 | dec32  | dec32  | c_int  | ..                                                      |
-| ✗ | __dpd_unorddd2 | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __bid_unorddd2 | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __dpd_unordtd2 | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __bid_unordtd2 | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __dpd_eqsd2    | dec32  | dec32  | c_int  |`a!=+-NaN and b!=+-Nan and a==b -> 0, else -> 1(nonzero)`|
-| ✗ | __bid_eqsd2    | dec32  | dec32  | c_int  | ..                                                      |
-| ✗ | __dpd_eqdd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __bid_eqdd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __dpd_eqtd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __bid_eqtd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __dpd_nesd2    | dec32  | dec32  | c_int  | `a==+-NaN or b==+-NaN or a!=b -> 1(nonzero), else -> 0` |
-| ✗ | __bid_nesd2    | dec32  | dec32  | c_int  | ..                                                      |
-| ✗ | __dpd_nedd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __bid_nedd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __dpd_netd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __bid_netd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __dpd_gesd2    | dec32  | dec32  | c_int  | `a!=+-NaN and b!=+-NaN and a>=b -> >=0, else -> <0`     |
-| ✗ | __bid_gesd2    | dec32  | dec32  | c_int  | ..                                                      |
-| ✗ | __dpd_gedd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __bid_gedd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __dpd_getd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __bid_getd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __dpd_ltsd2    | dec32  | dec32  | c_int  | `a!=+-NaN and b!=+-NaN and a<b -> <0, else -> >=0`      |
-| ✗ | __bid_ltsd2    | dec32  | dec32  | c_int  | ..                                                      |
-| ✗ | __dpd_ltdd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __bid_ltdd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __dpd_lttd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __bid_lttd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __dpd_lesd2    | dec32  | dec32  | c_int  | `a!=+-NaN and b!=+-NaN and a<=b -> <=0, else -> >=0`    |
-| ✗ | __bid_lesd2    | dec32  | dec32  | c_int  | ..                                                      |
-| ✗ | __dpd_ledd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __bid_ledd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __dpd_letd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __bid_letd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __dpd_gtsd2    | dec32  | dec32  | c_int  | `a!=+-NaN and b!=+-NaN and a>b -> >0, else -> <=0`      |
-| ✗ | __bid_gtsd2    | dec32  | dec32  | c_int  | ..                                                      |
-| ✗ | __dpd_gtdd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __bid_gtdd2    | dec64  | dec64  | c_int  | ..                                                      |
-| ✗ | __dpd_gttd2    | dec128 | dec128 | c_int  | ..                                                      |
-| ✗ | __bid_gttd2    | dec128 | dec128 | c_int  | ..                                                      |
-|   |                |        |        |        | **Decimal Float Arithmetic**[^options] |
-| ✗ | __dpd_addsd3   | dec32  | dec32  | dec32  |`a + b`|
-| ✗ | __bid_addsd3   | dec32  | dec32  | dec32  | ..    |
-| ✗ | __dpd_adddd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __bid_adddd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __dpd_addtd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __bid_addtd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __dpd_subsd3   | dec32  | dec32  | dec32  |`a - b`|
-| ✗ | __bid_subsd3   | dec32  | dec32  | dec32  | ..    |
-| ✗ | __dpd_subdd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __bid_subdd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __dpd_subtd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __bid_subtd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __dpd_mulsd3   | dec32  | dec32  | dec32  |`a * b`|
-| ✗ | __bid_mulsd3   | dec32  | dec32  | dec32  | ..    |
-| ✗ | __dpd_muldd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __bid_muldd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __dpd_multd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __bid_multd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __dpd_divsd3   | dec32  | dec32  | dec32  |`a / b`|
-| ✗ | __bid_divsd3   | dec32  | dec32  | dec32  | ..    |
-| ✗ | __dpd_divdd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __bid_divdd3   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __dpd_divtd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __bid_divtd3   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __dpd_negsd2   | dec32  | dec32  | dec32  | `-a`  |
-| ✗ | __bid_negsd2   | dec32  | dec32  | dec32  | ..    |
-| ✗ | __dpd_negdd2   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __bid_negdd2   | dec64  | dec64  | dec64  | ..    |
-| ✗ | __dpd_negtd2   | dec128 | dec128 | dec128 | ..    |
-| ✗ | __bid_negtd2   | dec128 | dec128 | dec128 | ..    |
-
-[^options]: These numbers include options with routines for +-0 and +-Nan.
-
-Fixed-point fractional library routines
-
-TODO brief explanation + implementation
-
-| Done   | Name          | a           | b         | Out       | Comment                    |
-| ------ | ------------- | ---------   | --------- | --------- | -------------------------- |
-|        |               |             |           |           | **Fixed-Point Fractional** |
-
-Math functions according to C99 with gnu extension sincos. f16, f80 and f128 functions
-are additionally supported by Zig, but not part of C standard. Alphabetically sorted.
-
-| Done | Name    | a         | b         | Out       | Comment                    |
-| ---- | ------- | --------- | --------- | --------- | -------------------------- |
-| ✓ | __ceilh    |     f16   |    ∅      |     f16   |smallest integer value not less than a|
-| ✓ | ceilf      |     f32   |    ∅      |     f32   |If a is integer, +-0, +-NaN, or +-infinite, a itself is returned.|
-| ✓ | ceil       |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __ceilx    |     f80   |    ∅      |     f80   |                            |
-| ✓ | ceilf128   |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | ceilq      |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | ceill      |long double|    ∅      |long double| ..                         |
-| ✓ | __cosh     |     f16   |    ∅      |     f16   | `cos(a)=(e^(ia)+e^(-ia))/2`|
-| ✓ | cosf       |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | cos        |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __cosx     |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | cosf128    |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | cosq       |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | cosl       |long double|    ∅      |long double| ..                         |
-| ✓ | __exph     |     f16   |    ∅      |     f16   | `e^a` with e base of natural logarithms|
-| ✓ | expf       |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | exp        |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __expx     |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | expf128    |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | expq       |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | expl       |long double|    ∅      |long double| ..                         |
-| ✓ | __exp2h    |     f16   |    ∅      |     f16   | `2^a`                      |
-| ✓ | exp2f      |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | exp2       |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __exp2x    |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | exp2f128   |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | exp2q      |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | exp2l      |long double|    ∅      |long double| ..                         |
-| ✓ | __fabsh    |     f16   |    ∅      |     f16   | absolute value of a        |
-| ✓ | fabsf      |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | fabs       |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __fabsx    |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | fabsf128   |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | fabsq      |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | fabsl      |long double|    ∅      |long double| ..                         |
-| ✓ | __floorh   |     f16   |    ∅      |     f16   |largest integer value not greater than a|
-| ✓ | floorf     |     f32   |    ∅      |     f32   |If a is integer, +-0, +-NaN, or +-infinite, a itself is returned.|
-| ✓ | floor      |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __floorx   |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | floorf128  |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | floorq     |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | floorl     |long double|    ∅      |long double| ..                         |
-| ✓ | __fmah     |     f16   |   2xf16   |     f16   | args a,b,c result `(a*b)+c`|
-| ✓ | fmaf       |     f32   |   2xf32   |     f32   |Fused multiply-add for hardware acceleration|
-| ✓ | fma        |     f64   |   2xf64   |     f64   | ..                         |
-| ✓ | __fmax     |     f80   |   2xf80   |     f80   | ..                         |
-| ✓ | fmaf128    |     f128  |   2xf128  |     f128  | ..                         |
-| ✓ | fmaq       |     f128  |   2xf128  |     f128  | .. PPC                     |
-| ✓ | fmal       |long double|2xlong double|long double| ..                         |
-| ✓ | __fmaxh    |     f16   |     f16   |     f16   | larger value of a,b        |
-| ✓ | fmaxf      |     f32   |     f32   |     f32   | ..                         |
-| ✓ | fmax       |     f64   |     f64   |     f64   | ..                         |
-| ✓ | __fmaxx    |     f80   |     f80   |     f80   | ..                         |
-| ✓ | fmaxf128   |     f128  |     f128  |     f128  | ..                         |
-| ✓ | fmaxq      |     f128  |     f128  |     f128  | .. PPC                     |
-| ✓ | fmaxl      |long double|long double|long double| ..                         |
-| ✓ | __fminh    |     f16   |     f16   |     f16   | smaller value of a,b       |
-| ✓ | fminf      |     f32   |     f32   |     f32   | ..                         |
-| ✓ | fmin       |     f64   |     f64   |     f64   | ..                         |
-| ✓ | __fminx    |     f80   |     f80   |     f80   | ..                         |
-| ✓ | fminf128   |     f128  |     f128  |     f128  | ..                         |
-| ✓ | fminq      |     f128  |     f128  |     f128  | .. PPC                     |
-| ✓ | fminl      |long double|long double|long double| ..                         |
-| ✓ | __fmodh    |     f16   |     f16   |     f16   |floating-point remainder of division a/b|
-| ✓ | fmodf      |     f32   |     f32   |     f32   | ..                         |
-| ✓ | fmod       |     f64   |     f64   |     f64   | ..                         |
-| ✓ | __fmodx    |     f80   |     f80   |     f80   | ..                         |
-| ✓ | fmodf128   |     f128  |     f128  |     f128  | ..                         |
-| ✓ | fmodq      |     f128  |     f128  |     f128  | .. PPC                     |
-| ✓ | fmodl      |long double|long double|long double| ..                         |
-| ✓ | __logh     |     f16   |    ∅      |     f16   |natural (base-e) logarithm of a|
-| ✓ | logf       |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | log        |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __logx     |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | logf128    |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | logq       |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | logl       |long double|    ∅      |long double| ..                         |
-| ✓ | __log10h   |     f16   |    ∅      |     f16   |common (base-10) logarithm of a|
-| ✓ | log10f     |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | log10      |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __log10x   |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | log10f128  |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | log10q     |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | log10l     |long double|    ∅      |long double| ..                         |
-| ✓ | __log2h    |     f16   |    ∅      |     f16   | base-2 logarithm of a      |
-| ✓ | log2f      |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | log2       |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __log2x    |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | log2f128   |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | log2q      |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | log2l      |long double|    ∅      |long double| ..                         |
-| ✓ | __roundh   |     f16   |    ∅      |     f16   | a rounded to next int away from zero|
-| ✓ | roundf     |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | round      |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __roundx   |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | roundf128  |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | roundq     |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | roundl     |long double|    ∅      |long double| ..                         |
-| ✓ | __sinh     |     f16   |    ∅      |     f16   | `sin(a)=(e^(ia)-e^(-ia))/2`|
-| ✓ | sinf       |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | sin        |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __sinx     |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | sinf128    |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | sinq       |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | sinl       |long double|    ∅      |long double| ..                         |
-| ✓ | __sincosh  |     f16   | 2x *f16   |     ∅     |sin and cos of the same angle a|
-| ✓ | sincosf    |     f32   | 2x *f32   |     ∅     |args a,*b,*c, `b.*=sin(x),c.*=cos(x)`|
-| ✓ | sincos     |     f64   | 2x *f64   |     ∅     | ..                         |
-| ✓ | __sincosx  |     f80   | 2x *f80   |     ∅     | ..                         |
-| ✓ | sincosf128 |     f128  | 2x *f128  |     ∅     | ..                         |
-| ✓ | sincosq    |     f128  | 2x *f128  |     ∅     | .. PPC                     |
-| ✓ | sincosl    |long double| 2x *long double|∅     | ..                         |
-| ✓ | __sqrth    |     f16   |    ∅      |     f16   | square root of a (find `r st. a=r^2`)|
-| ✓ | sqrtf      |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | sqrt       |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __sqrtx    |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | sqrtf128   |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | sqrtq      |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | sqrtl      |long double|    ∅      |long double| ..                         |
-| ✓ | __tanh     |     f16   |    ∅      |     f16   | `tan(x)=sin(x)/cos(x)      |
-| ✓ | tanf       |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | tan        |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __tanx     |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | tanf128    |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | tanq       |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | tanl       |long double|    ∅      |long double| ..                         |
-| ✓ | __trunch   |     f16   |    ∅      |     f16   | a rounded to next int towards zero|
-| ✓ | truncf     |     f32   |    ∅      |     f32   | ..                         |
-| ✓ | trunc      |     f64   |    ∅      |     f64   | ..                         |
-| ✓ | __truncx   |     f80   |    ∅      |     f80   | ..                         |
-| ✓ | truncf128  |     f128  |    ∅      |     f128  | ..                         |
-| ✓ | truncq     |     f128  |    ∅      |     f128  | .. PPC                     |
-| ✓ | truncl     |long double|    ∅      |long double| ..                         |
-
-Arbitrary Precision Big Integer (BigInt) library routines
-
-TODO brief description
-
-| Done | Name    | result| a     | b     | size| ret   | Comment               |
-| ---- | ------- | ----- | ----- | ----- | --- | ----- |---------------------- |
-| |              |       |       |       |     |       |**BigInt Bit Operation**|
-| |              |       |       |       |     |       |**BigInt Comparison**   |
-| |              |       |       |       |     |       |**BigInt Arithmetic**   |
-|✓|__udivei4     |[*c]u32|[*c]u32|[*c]u32|usize|void   | `a / b`               |
-|✓|__umodei4     |[*c]u32|[*c]u32|[*c]u32|usize|void   | `a % b`               |
-|✗|__divei4      |[*c]u32|[*c]u32|[*c]u32|usize|void   | `a / b`               |
-|✗|__modei4      |[*c]u32|[*c]u32|[*c]u32|usize|void   | `a % b`               |
-| |              |       |       |       |     |       |**BigInt Arithmetic with Trapping Overflow**|
-| |              |       |       |       |     |       |**BigInt Arithmetic which Return on Overflow**[^noptr_faster]|
-
-Further content (conditionally) exported with C abi:
-
-ARM-only routines
-
-| Done | Name      | a   | b   | Out  | Comment               |
-| ---- | --------  | --- | --- | -----| ----------------------|
-| |                |     |     |      | **Float Comparison**  |
-|✗|__aeabi_cfcmpeq | f32 | f32 | void | `a == b` result in PSR ZC flags[^PSRZC] |
-|✗|__aeabi_cfcmple | f32 | f32 | void | `a <= b` result ..    |
-|✗|__aeabi_cfrcmple| f32 | f32 | void | `b <= a` ..           |
-|✗|__aeabi_cdcmpeq | f64 | f64 | void | `a == b` ..           |
-|✗|__aeabi_cdcmple | f64 | f64 | void | `a <= b` ..           |
-|✗|__aeabi_cdrcmple| f64 | f64 | void | `b <= a` ..           |
-| |                |     |     |      | **Float Arithmetic**  |
-|✗|__aeabi_frsub   | f64 | f64 | f64  | `b - a`               |
-|✗|__aeabi_drsub   | f64 | f64 | f64  | ..                    |
-| |                |     |     |      | **Special**           |
-|✓|__aeabi_read_tp |  ∅  |  ∅  | *u8  | ret tls pointer       |
-|✗|__aeabi_idiv0   | i32 |  ∅  | i32  | div by 0 modifier     |
-|✗|__aeabi_ldiv0   | i64 |  ∅  | i64  | div by 0 modifier     |
-| |                |     |     |      | **Unaligned memory access** |
-|✗|__aeabi_uread4  |[*]u8|  ∅  | i32  | ret value read        |
-|✗|__aeabi_uwrite4 | i32 |[*]u8| i32  | ret value written     |
-|✗|__aeabi_uread8  |[*]u8|  ∅  | i64  | ..                    |
-|✗|__aeabi_uwrite8 | i64 |[*]u8| i64  | ..                    |
-
-
-| Done | Name      | a   | b   | c  | Comment                 |
-| ---- | --------  | --- | --- | -----| ----------------------|
-| |                |     |     |      | **Memory copy, move and set** |
-|✓|__aeabi_memcpy8 |[*]u8|[*]u8| usize| *dest, *src, size     |
-|✓|__aeabi_memcpy4 |[*]u8|[*]u8| usize| ..                    |
-|✓|__aeabi_memcpy  |[*]u8|[*]u8| usize| ..                    |
-|✓|__aeabi_memmove8|[*]u8|[*]u8| usize| *dest, *src, size     |
-|✓|__aeabi_memmove4|[*]u8|[*]u8| usize| ..                    |
-|✓|__aeabi_memmove |[*]u8|[*]u8| usize| ..                    |
-|✓|__aeabi_memset8 |[*]u8|usize| i32  | *dest, size, char     |
-|✓|__aeabi_memset4 |[*]u8|usize| i32  | ..                    |
-|✓|__aeabi_memset  |[*]u8|usize| i32  | ..                    |
-|✓|__aeabi_memclr8 |[*]u8| u32 | usize| *dest, size           |
-|✓|__aeabi_memclr4 |[*]u8| u32 | usize| ..                    |
-|✓|__aeabi_memclr  |[*]u8| u32 | usize| ..                    |
-|✓|__aeabi_uwrite8 | i64 |[*]u8| i64  | ..                    |
-
-- __aeabi_read_tp
-
-[^PSRZC]: return result in the CPSR Z and C flag. C is clear only if the
-operands are ordered and the first operand is less than the second.
-Z is set only when the operands are ordered and equal.
-Preserves all core registers except ip, lr, and the CPSR.
-
-- aarch64 outline atomics
-- atomics
-- bcmp
-- clear cache
-- memory routines (memcmp, memcpy, memset, memmove)
-- msvc things like _alldiv, _aulldiv, _allrem
-- objective-c __isPlatformVersionAtLeast check
-- stack probe routines
-- tls emulation