authorgravatar for jan.hafer@rwth-aachen.deJan Philipp Hafer <jan.hafer@rwth-aachen.de> 2023-01-26 22:44:39+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-02-02 17:45:38-05:00
log03cdb4fb5853109e46bdc08d8a849a23780093ae
tree2ccf60b8cbbf760d956db7e4d0f81ab7b84fa195
parent7505d19e931893c01cf78760fa31d819ef10e879

compiler_rt: make README visually nice and improve explanations

This commit makes the text more dense with sources, noes the outstanding audit and adds an explanation of the table before converting everything to markdown tables. For the status a checkmark or cross in utf8 encoding are used and the input and output sizes of all operations are given inclusive comments for understanding of the routines. This should document all compiler_rt integer and float routines, but does not include a documentation of existing ieee floating and math routines.

1 files changed, 534 insertions(+), 471 deletions(-)

lib/compiler_rt/README.md+534-471
......@@ -27,482 +27,545 @@ then statically linked and therefore is a transparent dependency for the
2727programmer.
2828For details see `../compiler_rt.zig`.
2929
30The routines in this folder are listed below.
31Routines are annotated as `type source routine // description`, with `routine`
32being the name used in aforementioned `compiler_rt.zig`.
33`dev` means deviating from compiler_rt, `port` ported, `source` is the
34information source for the implementation, `none` means unimplemented.
35Some examples for the naming convention are:
36- dev source name_routine, name_routine2 various implementations for performance, simplicity etc
37- port llvm compiler-rt library routines from [LLVM](http://compiler-rt.llvm.org/)
38 * LLVM emits library calls to compiler-rt, if the hardware lacks functionality
39- port musl libc routines from [musl](https://musl.libc.org/)
40If the library or information source is uncommon, use the entry `other` for `source`.
41Please do not break the search by inserting entries in another format than `impl space source`.
42
4330Bugs should be solved by trying to duplicate the bug upstream, if possible.
4431 * If the bug exists upstream, get it fixed upstream and port the fix downstream to Zig.
4532 * If the bug only exists in Zig, use the corresponding C code and debug
4633 both implementations side by side to figure out what is wrong.
4734
48## Integer library routines
49
50#### Integer Bit operations
51
52- dev HackersDelight __clzsi2 // count leading zeros
53- dev HackersDelight __clzdi2 // count leading zeros
54- dev HackersDelight __clzti2 // count leading zeros
55- dev HackersDelight __ctzsi2 // count trailing zeros
56- dev HackersDelight __ctzdi2 // count trailing zeros
57- dev HackersDelight __ctzti2 // count trailing zeros
58- dev __ctzsi2 __ffssi2 // find least significant 1 bit
59- dev __ctzsi2 __ffsdi2 // find least significant 1 bit
60- dev __ctzsi2 __ffsti2 // find least significant 1 bit
61- dev BitTwiddlingHacks __paritysi2 // bit parity
62- dev BitTwiddlingHacks __paritydi2 // bit parity
63- dev BitTwiddlingHacks __parityti2 // bit parity
64- dev TAOCP __popcountsi2 // bit population
65- dev TAOCP __popcountdi2 // bit population
66- dev TAOCP __popcountti2 // bit population
67- dev other __bswapsi2 // a byteswapped
68- dev other __bswapdi2 // a byteswapped
69- dev other __bswapti2 // a byteswapped
70
71#### Integer Comparison
72
73- port llvm __cmpsi2 // a,b: i32, (a<b)-> 0, (a==b) -> 1, (a>b) -> 2
74- port llvm __cmpdi2 // a,b: i64
75- port llvm __cmpti2 // a,b: i128
76- port llvm __ucmpsi2 // a,b: u32, (a<b)-> 0, (a==b) -> 1, (a>b) -> 2
77- port llvm __ucmpdi2 // a,b: u64
78- port llvm __ucmpti2 // a,b: u128
79
80#### Integer Arithmetic
81
82- none none __ashlsi3 // a,b: i32, a << b unused in llvm, TODO (e.g. used by rl78)
83- port llvm __ashldi3 // a,b: u64
84- port llvm __ashlti3 // a,b: u128
85- none none __ashrsi3 // a,b: i32, a >> b arithmetic (sign fill) TODO (e.g. used by rl78)
86- port llvm __ashrdi3 // ..
87- port llvm __ashrti3 //
88- none none __lshrsi3 // a,b: i32, a >> b logical (zero fill) TODO (e.g. used by rl78)
89- port llvm __lshrdi3 //
90- port llvm __lshrti3 //
91- port llvm __negdi2 // a: i32, -a, symbol-level compatibility with libgcc
92- port llvm __negti2 // unnecessary: unused in backends
93- port llvm __mulsi3 // a,b: i32, a * b
94- port llvm __muldi3 //
95- port llvm __multi3 //
96- port llvm __divsi3 // a,b: i32, a / b
97- port llvm __divdi3 //
98- port llvm __divti3 //
99- port llvm __udivsi3 // a,b: u32, a / b
100- port llvm __udivdi3 //
101- port llvm __udivti3 //
102- port llvm __modsi3 // a,b: i32, a % b
103- port llvm __moddi3 //
104- port llvm __modti3 //
105- port llvm __umodsi3 // a,b: u32, a % b
106- port llvm __umoddi3 //
107- port llvm __umodti3 //
108- port llvm __udivmoddi4 // a,b: u32, a / b, rem.* = a % b unsigned
109- port llvm __udivmodti4 //
110- port llvm __udivmodsi4 //
111- port llvm __divmodsi4 // a,b: i32, a / b, rem.* = a % b signed, ARM
112- port llvm __divmoddi4 //
113
114#### Integer Arithmetic with trapping overflow
115
116- dev BitTwiddlingHacks __absvsi2 // abs(a)
117- dev BitTwiddlingHacks __absvdi2 // abs(a)
118- dev BitTwiddlingHacks __absvti2 // abs(a)
119- port llvm __negvsi2 // -a symbol-level compatibility: libgcc
120- port llvm __negvdi2 // -a unnecessary: unused in backends
121- port llvm __negvti2 // -a
122- TODO upstreaming __addvsi3..__mulvti3 after testing panics works
123- dev HackersDelight __addvsi3 // a + b
124- dev HackersDelight __addvdi3 //
125- dev HackersDelight __addvti3 //
126- dev HackersDelight __subvsi3 // a - b
127- dev HackersDelight __subvdi3 //
128- dev HackersDelight __subvti3 //
129- dev HackersDelight __mulvsi3 // a * b
130- dev HackersDelight __mulvdi3 //
131- dev HackersDelight __mulvti3 //
132
133#### Integer Arithmetic which returns if overflow (would be faster without pointer)
134
135- dev HackersDelight __addosi4 // a + b, overflow->ov.*=1 else 0
136- dev HackersDelight __addodi4 // (completeness + performance, llvm does not use them)
137- dev HackersDelight __addoti4 //
138- dev HackersDelight __subosi4 // a - b, overflow->ov.*=1 else 0
139- dev HackersDelight __subodi4 // (completeness + performance, llvm does not use them)
140- dev HackersDelight __suboti4 //
141- dev HackersDelight __mulosi4 // a * b, overflow->ov.*=1 else 0
142- dev HackersDelight __mulodi4 // (required by llvm)
143- dev HackersDelight __muloti4 //
144
145## Float library routines
146
147TODO: review source of implementation
148
149#### Float Conversion
150
151- dev other __extendsfdf2 // a: f32 -> f64, TODO: missing tests
152- dev other __extendsftf2 // a: f32 -> f128
153- dev llvm __extendsfxf2 // a: f32 -> f80, TODO: missing tests
154- dev other __extenddftf2 // a: f64 -> f128
155- dev llvm __extenddfxf2 // a: f64 -> f80
156- dev other __truncdfsf2 // a: f64 -> f32, rounding towards zero
157- dev other __trunctfdf2 // a: f128-> f64
158- dev other __trunctfsf2 // a: f128-> f32
159- dev llvm __truncxfsf2 // a: f80 -> f32, TODO: missing tests
160- dev llvm __truncxfdf2 // a: f80 -> f64, TODO: missing tests
161
162- dev unclear __fixsfsi // a: f32 -> i32, rounding towards zero
163- dev unclear __fixdfsi // a: f64 -> i32
164- dev unclear __fixtfsi // a: f128-> i32
165- dev unclear __fixxfsi // a: f80 -> i32, TODO: missing tests
166- dev unclear __fixsfdi // a: f32 -> i64, rounding towards zero
167- dev unclear __fixdfdi // ..
168- dev unclear __fixtfdi //
169- dev unclear __fixxfdi // TODO: missing tests
170- dev unclear __fixsfti // a: f32 -> i128, rounding towards zero
171- dev unclear __fixdfti // ..
172- dev unclear __fixtfdi //
173- dev unclear __fixxfti // TODO: missing tests
174
175- dev unclear __fixunssfsi // a: f32 -> u32, rounding towards zero. negative values become 0.
176- dev unclear __fixunsdfsi // ..
177- dev unclear __fixunstfsi //
178- dev unclear __fixunsxfsi // TODO: missing tests
179- dev unclear __fixunssfdi // a: f32 -> u64, rounding towards zero. negative values become 0.
180- dev unclear __fixunsdfdi //
181- dev unclear __fixunstfdi //
182- dev unclear __fixunsxfdi // TODO: missing tests
183- dev unclear __fixunssfti // a: f32 -> u128, rounding towards zero. negative values become 0.
184- dev unclear __fixunsdfti //
185- dev unclear __fixunstfdi //
186- dev unclear __fixunsxfti // TODO: some more tests needed for base coverage
187
188- dev unclear __floatsisf // a: i32 -> f32
189- dev unclear __floatsidf // a: i32 -> f64, TODO: missing tests
190- dev unclear __floatsitf // ..
191- dev unclear __floatsixf // TODO: missing tests
192- dev unclear __floatdisf // a: i64 -> f32
193- dev unclear __floatdidf //
194- dev unclear __floatditf //
195- dev unclear __floatdixf // TODO: missing tests
196- dev unclear __floattisf // a: i128-> f32
197- dev unclear __floattidf //
198- dev unclear __floattitf //
199- dev unclear __floattixf // TODO: missing tests
200
201- dev unclear __floatunsisf // a: u32 -> f32
202- dev unclear __floatunsidf // TODO: missing tests
203- dev unclear __floatunsitf //
204- dev unclear __floatunsixf // TODO: missing tests
205- dev unclear __floatundisf // a: u64 -> f32
206- dev unclear __floatundidf //
207- dev unclear __floatunditf //
208- dev unclear __floatundixf // TODO: missing tests
209- dev unclear __floatuntisf // a: u128-> f32
210- dev unclear __floatuntidf //
211- dev unclear __floatuntitf //
212- dev unclear __floatuntixf // TODO: missing tests
213
214#### Float Comparison
215
216- dev other __cmpsf2 // a,b:f32, (a<b)->-1,(a==b)->0,(a>b)->1,Nan->1
217- dev other __cmpdf2 // exported from __lesf2, __ledf2, __letf2 (below)
218- dev other __cmptf2 // But: if NaN is a possibility, use another routine.
219- dev other __unordsf2 // a,b:f32, (a==+-NaN or b==+-NaN) -> !=0, else -> 0
220- dev other __unorddf2 // __only reliable for (input!=NaN)__
221- dev other __unordtf2 // TODO: missing tests
222- dev other __eqsf2 // (a!=NaN) and (b!=Nan) and (a==b) -> output=0
223- dev other __eqdf2 //
224- dev other __eqtf2 //
225- dev other __nesf2 // (a==NaN) or (b==Nan) or (a!=b) -> output!=0
226- dev other __nedf2 //
227- dev other __netf2 // __eqtf2 and __netf2 have same return value -> tested with __eqsf2
228- dev other __gesf2 // (a!=Nan) and (b!=Nan) and (a>=b) -> output>=0
229- dev other __gedf2 //
230- dev other __getf2 // TODO: missing tests
231- dev other __ltsf2 // (a!=Nan) and (b!=Nan) and (a<b) -> output<0
232- dev other __ltdf2 //
233- dev other __lttf2 // TODO: missing tests
234- dev other __lesf2 // (a!=Nan) and (b!=Nan) and (a<=b) -> output<=0
235- dev other __ledf2 //
236- dev other __letf2 // TODO: missing tests
237- dev other __gtsf2 // (a!=Nan) and (b!=Nan) and (a>b) -> output>0
238- dev other __gtdf2 //
239- dev other __gttf2 // TODO: missing tests
240
241#### Float Arithmetic
242
243- dev unclear __addsf3 // a + b f32, TODO: missing tests
244- dev unclear __adddf3 // a + b f64, TODO: missing tests
245- dev unclear __addtf3 // a + b f128
246- dev unclear __addxf3 // a + b f80
247- dev unclear __aeabi_fadd // a + b f64 ARM: AAPCS
248- dev unclear __aeabi_dadd // a + b f64 ARM: AAPCS
249- dev unclear __subsf3 // a - b, TODO: missing tests
250- dev unclear __subdf3 // a - b, TODO: missing tests
251- dev unclear __subtf3 // a - b
252- dev unclear __subxf3 // a - b f80, TODO: missing tests
253- dev unclear __aeabi_fsub // a - b f64 ARM: AAPCS
254- dev unclear __aeabi_dsub // a - b f64 ARM: AAPCS
255- dev unclear __mulsf3 // a * b, TODO: missing tests
256- dev unclear __muldf3 // a * b, TODO: missing tests
257- dev unclear __multf3 // a * b
258- dev unclear __mulxf3 // a * b
259- dev unclear __divsf3 // a / b, TODO: review tests
260- dev unclear __divdf3 // a / b, TODO: review tests
261- dev unclear __divtf3 // a / b
262- dev unclear __divxf3 // a / b
263- dev unclear __negsf2 // -a symbol-level compatibility: libgcc uses this for the rl78
264- dev unclear __negdf2 // -a unnecessary: can be lowered directly to a xor
265- dev unclear __negtf2 // -a, TODO: missing tests
266- dev unclear __negxf2 // -a, TODO: missing tests
267
268#### Floating point raised to integer power
269- dev unclear __powisf2 // a ^ b, TODO
270- dev unclear __powidf2 //
271- dev unclear __powitf2 //
272- dev unclear __powixf2 //
273- dev unclear __mulsc3 // (a+ib) * (c+id)
274- dev unclear __muldc3 //
275- dev unclear __multc3 //
276- dev unclear __mulxc3 //
277- dev unclear __divsc3 // (a+ib) * / (c+id)
278- dev unclear __divdc3 //
279- dev unclear __divtc3 //
280- dev unclear __divxc3 //
281
282## Decimal float library routines
35Routines with status are given below. Sources were besides
36"The Art of Computer Programming" by Donald E. Knuth, "HackersDelight" by Henry S. Warren,
37"Bit Twiddling Hacks" collected by Sean Eron Anderson, "Berkeley SoftFloat" by John R. Hauser,
38LLVM "compiler-rt" as it was MIT-licensed, "musl libc" and thoughts + work of contributors.
39
40The compiler-rt routines have not yet been audited.
41See https://github.com/ziglang/zig/issues/1504.
42
43From left to right the columns mean 1. if the routine is implemented (✗ or ✓),
442. the name, 3. input (`a`), 4. input (`b`), 5. return value,
456. an explanation of the functionality, .. to repeat the comment from the
46column a row above and/or additional return values.
47Some routines have more extensive comments supplemented with a reference text.
48
49Integer and Float Operations
50
51| Done | Name | a | b | Out | Comment |
52| ------ | ------------- | ---- | ---- | ---- | ------------------------------ |
53| | | | | | **Integer Bit Operations** |
54| ✓ | __clzsi2 | u32 | ∅ | i32 | count leading zeroes |
55| ✓ | __clzdi2 | u64 | ∅ | i32 | count leading zeroes |
56| ✓ | __clzti2 | u128 | ∅ | i32 | count trailing zeros |
57| ✓ | __ctzsi2 | u32 | ∅ | i32 | count trailing zeros |
58| ✓ | __ctzdi2 | u64 | ∅ | i32 | count trailing zeros |
59| ✓ | __ctzti2 | u128 | ∅ | i32 | count leading zeroes |
60| ✓ | __ffssi2 | u32 | ∅ | i32 | count leading zeroes |
61| ✓ | __ffsdi2 | u64 | ∅ | i32 | count leading zeroes |
62| ✓ | __ffsti2 | u128 | ∅ | i32 | count leading zeroes |
63| ✓ | __paritysi2 | u32 | ∅ | i32 | find least significant 1 bit |
64| ✓ | __paritydi2 | u64 | ∅ | i32 | find least significant 1 bit |
65| ✓ | __parityti2 | u128 | ∅ | i32 | find least significant 1 bit |
66| ✓ | __popcountsi2 | u32 | ∅ | i32 | bit population |
67| ✓ | __popcountdi2 | u64 | ∅ | i32 | bit population |
68| ✓ | __popcountti2 | u128 | ∅ | i32 | bit population |
69| ✓ | __bswapsi2 | u32 | ∅ | i32 | bit parity |
70| ✓ | __bswapdi2 | u64 | ∅ | i32 | bit parity |
71| ✓ | __bswapti2 | u128 | ∅ | i32 | bit parity |
72| | | | | | **Integer Comparison** |
73| ✓ | __cmpsi2 | i32 | i32 | i32 | `(a<b) -> 0, (a==b) -> 1, (a>b) -> 2` |
74| ✓ | __cmpdi2 | i64 | i64 | i32 | .. |
75| ✓ | __cmpti2 | i128 | i128 | i32 | .. |
76| ✓ | __ucmpsi2 | i32 | i32 | i32 | `(a<b) -> 0, (a==b) -> 1, (a>b) -> 2` |
77| ✓ | __ucmpdi2 | i64 | i64 | i32 | .. |
78| ✓ | __ucmpti2 | i128 | i128 | i32 | .. |
79| | | | | | **Integer Arithmetic** |
80| ✗ | __ashlsi3 | i32 | i32 | i32 | `a << b` [^unused_rl78] |
81| ✓ | __ashldi3 | i64 | i32 | i64 | .. |
82| ✓ | __ashlti3 | i128 | i32 | i128 | .. |
83| ✓ | __aeabi_llsl | i32 | i32 | i32 | .. ARM |
84| ✗ | __ashrsi3 | i32 | i32 | i32 | `a >> b` arithmetic (sign fill) [^unused_rl78] |
85| ✓ | __ashrdi3 | i64 | i32 | i64 | .. |
86| ✓ | __ashrti3 | i128 | i32 | i128 | .. |
87| ✓ | __aeabi_lasr | i64 | i32 | i64 | .. ARM |
88| ✗ | __lshrsi3 | i32 | i32 | i32 | `a >> b` logical (zero fill) [^unused_rl78] |
89| ✓ | __lshrdi3 | i64 | i32 | i64 | .. |
90| ✓ | __lshrti3 | i128 | i32 | i128 | .. |
91| ✓ | __aeabi_llsr | i64 | i32 | i64 | .. ARM |
92| ✓ | __negsi2 | i32 | i32 | i32 | `-a` [^libgcc_compat] |
93| ✓ | __negdi2 | i64 | i64 | i64 | .. |
94| ✓ | __negti2 | i128 | i128 | i128 | .. |
95| ✓ | __mulsi3 | i32 | i32 | i32 | `a * b` |
96| ✓ | __muldi3 | i64 | i64 | i64 | .. |
97| ✓ | __multi3 | i128 | i128 | i128 | .. |
98| ✓ | __divsi3 | i32 | i32 | i32 | `a / b` |
99| ✓ | __divdi3 | i64 | i64 | i64 | .. |
100| ✓ | __divti3 | i128 | i128 | i128 | .. |
101| ✓ | __aeabi_idiv | i32 | i32 | i32 | .. ARM |
102| ✓ | __udivsi3 | u32 | u32 | u32 | `a / b` |
103| ✓ | __udivdi3 | u64 | u64 | u64 | .. |
104| ✓ | __udivti3 | u128 | u128 | u128 | .. |
105| ✓ | __aeabi_uidiv | i32 | i32 | i32 | .. ARM |
106| ✓ | __modsi3 | i32 | i32 | i32 | `a % b` |
107| ✓ | __moddi3 | i64 | i64 | i64 | .. |
108| ✓ | __modti3 | i128 | i128 | i128 | .. |
109| ✓ | __umodsi3 | u32 | u32 | u32 | `a % b` |
110| ✓ | __umoddi3 | u64 | u64 | u64 | .. |
111| ✓ | __umodti3 | u128 | u128 | u128 | .. |
112| ✓ | __udivmodsi4 | u32 | u32 | u32 | `a / b, rem.* = a % b` |
113| ✓ | __udivmoddi4 | u64 | u64 | u64 | .. |
114| ✓ | __udivmodti4 | u128 | u128 | u128 | .. |
115| ✓ | __divmodsi4 | i32 | i32 | i32 | `a / b, rem.* = a % b` |
116| ✓ | __divmoddi4 | i64 | i64 | i64 | .. |
117| ✗ | __divmodti4 | i128 | i128 | i128 | .. [^libgcc_compat] |
118| | | | | | **Integer Arithmetic with Trapping Overflow**|
119| ✓ | __absvsi2 | i32 | i32 | i32 | abs(a) |
120| ✓ | __absvdi2 | i64 | i64 | i64 | .. |
121| ✓ | __absvti2 | i128 | i128 | i128 | .. |
122| ✓ | __negvsi2 | i32 | i32 | i32 | `-a` [^libgcc_compat] |
123| ✓ | __negvdi2 | i64 | i64 | i64 | .. |
124| ✓ | __negvti2 | i128 | i128 | i128 | .. |
125| ✗ | __addvsi3 | i32 | i32 | i32 | `a + b` |
126| ✗ | __addvdi3 | i64 | i64 | i64 | .. |
127| ✗ | __addvti3 | i128 | i128 | i128 | .. |
128| ✗ | __subvsi3 | i32 | i32 | i32 | `a - b` |
129| ✗ | __subvdi3 | i64 | i64 | i64 | .. |
130| ✗ | __subvti3 | i128 | i128 | i128 | .. |
131| ✗ | __mulvsi3 | i32 | i32 | i32 | `a * b` |
132| ✗ | __mulvdi3 | i64 | i64 | i64 | .. |
133| ✗ | __mulvti3 | i128 | i128 | i128 | .. |
134| | | | | | **Integer Arithmetic which Return on Overflow** [^noptr_faster] |
135| ✓ | __addosi4 | i32 | i32 | i32 | `a + b`, overflow->ov.*=1 else 0 [^perf_addition] |
136| ✓ | __addodi4 | i64 | i64 | i64 | .. |
137| ✓ | __addoti4 | i128 | i128 | i128 | .. |
138| ✓ | __subosi4 | i32 | i32 | i32 | `a - b`, overflow->ov.*=1 else 0 [^perf_addition] |
139| ✓ | __subodi4 | i64 | i64 | i64 | .. |
140| ✓ | __suboti4 | i128 | i128 | i128 | .. |
141| ✓ | __mulosi4 | i32 | i32 | i32 | `a * b`, overflow->ov.*=1 else 0 |
142| ✓ | __mulodi4 | i64 | i64 | i64 | .. |
143| ✓ | __muloti4 | i128 | i128 | i128 | .. |
144| | | | | | **Float Conversion** |
145| ✓ | __extendsfdf2 | f32 | ∅ | f64 | .. |
146| ✓ | __extendsftf2 | f32 | ∅ | f128 | .. |
147| ✓ | __extendsfxf2 | f32 | ∅ | f80 | .. |
148| ✓ | __extenddftf2 | f64 | ∅ | f128 | .. |
149| ✓ | __extenddfxf2 | f64 | ∅ | f80 | .. |
150| ✓ | __truncsfhf2 | f32 | ∅ | f16 | rounding towards zero |
151| ✓ | __truncdfhf2 | f64 | ∅ | f16 | .. |
152| ✓ | __truncdfsf2 | f64 | ∅ | f32 | .. |
153| ✓ | __trunctfhf2 | f128 | ∅ | f16 | .. |
154| ✓ | __trunctfsf2 | f128 | ∅ | f32 | .. |
155| ✓ | __trunctfdf2 | f128 | ∅ | f64 | .. |
156| ✓ | __trunctfxf2 | f128 | ∅ | f80 | .. |
157| ✓ | __truncxfhf2 | f80 | ∅ | f16 | .. |
158| ✓ | __truncxfsf2 | f80 | ∅ | f32 | .. |
159| ✓ | __truncxfdf2 | f80 | ∅ | f64 | .. |
160| ✓ | __aeabi_f2h | f32 | ∅ | f16 | .. ARM |
161| ✓ | __gnu_f2h_ieee | f32 | ∅ | f16 | ..GNU naming convention |
162| ✓ | __aeabi_d2h | f64 | ∅ | f16 | .. ARM |
163| ✓ | __aeabi_d2f | f64 | ∅ | f32 | .. ARM |
164| ✓ | __trunckfsf2 | f128 | ∅ | f32 | .. PPC |
165| ✓ | _Qp_qtos |*f128 | ∅ | f32 | .. SPARC |
166| ✓ | __trunckfdf2 | f128 | ∅ | f64 | .. PPC |
167| ✓ | _Qp_qtod |*f128 | ∅ | f64 | .. SPARC |
168| ✓ | __fixhfsi | f16 | ∅ | i32 | rounding towards zero |
169| ✓ | __fixsfsi | f32 | ∅ | i32 | .. |
170| ✓ | __fixdfsi | f64 | ∅ | i32 | .. |
171| ✓ | __fixtfsi | f128 | ∅ | i32 | .. |
172| ✓ | __fixxfsi | f80 | ∅ | i32 | .. |
173| ✓ | __fixhfdi | f16 | ∅ | i64 | .. |
174| ✓ | __fixsfdi | f32 | ∅ | i64 | .. |
175| ✓ | __fixdfdi | f64 | ∅ | i64 | .. |
176| ✓ | __fixtfdi | f128 | ∅ | i64 | .. |
177| ✓ | __fixxfdi | f80 | ∅ | i64 | .. |
178| ✓ | __fixhfti | f16 | ∅ | i128 | .. |
179| ✓ | __fixsfti | f32 | ∅ | i128 | .. |
180| ✓ | __fixdfti | f64 | ∅ | i128 | .. |
181| ✓ | __fixtfti | f128 | ∅ | i128 | .. |
182| ✓ | __fixxfti | f80 | ∅ | i128 | .. |
183| ✓ | __fixunshfsi | f16 | ∅ | u32 | rounding towards zero. negative values become 0. |
184| ✓ | __fixunssfsi | f32 | ∅ | u32 | .. |
185| ✓ | __fixunsdfsi | f64 | ∅ | u32 | .. |
186| ✓ | __fixunstfsi | f128 | ∅ | u32 | .. |
187| ✓ | __fixunsxfsi | f80 | ∅ | u32 | .. |
188| ✓ | __fixunshfdi | f16 | ∅ | u64 | .. |
189| ✓ | __fixunssfdi | f32 | ∅ | u64 | .. |
190| ✓ | __fixunsdfdi | f64 | ∅ | u64 | .. |
191| ✓ | __fixunstfdi | f128 | ∅ | u64 | .. |
192| ✓ | __fixunsxfdi | f80 | ∅ | u64 | .. |
193| ✓ | __fixunshfti | f16 | ∅ | u128 | .. |
194| ✓ | __fixunssfti | f32 | ∅ | u128 | .. |
195| ✓ | __fixunsdfti | f64 | ∅ | u128 | .. |
196| ✓ | __fixunstfti | f128 | ∅ | u128 | .. |
197| ✓ | __fixunsxfti | f80 | ∅ | u128 | .. |
198| ✓ | __floatsihf | i32 | ∅ | f16 | int_to_float conversions |
199| ✓ | __floatsisf | i32 | ∅ | f32 | .. |
200| ✓ | __floatsidf | i32 | ∅ | f64 | .. |
201| ✓ | __floatsitf | i32 | ∅ | f128 | .. |
202| ✓ | __floatsixf | i32 | ∅ | f80 | .. |
203| ✓ | __floatdisf | i64 | ∅ | f32 | .. |
204| ✓ | __floatdidf | i64 | ∅ | f64 | .. |
205| ✓ | __floatditf | i64 | ∅ | f128 | .. |
206| ✓ | __floatdixf | i64 | ∅ | f80 | .. |
207| ✓ | __floattihf | i128 | ∅ | f16 | .. |
208| ✓ | __floattisf | i128 | ∅ | f32 | .. |
209| ✓ | __floattidf | i128 | ∅ | f64 | .. |
210| ✓ | __floattitf | i128 | ∅ | f128 | .. |
211| ✓ | __floattixf | i128 | ∅ | f80 | .. |
212| ✓ | __floatunsihf | u32 | ∅ | f16 | uint_to_float conversions |
213| ✓ | __floatunsisf | u32 | ∅ | f32 | .. |
214| ✓ | __floatunsidf | u32 | ∅ | f64 | .. |
215| ✓ | __floatunsitf | u32 | ∅ | f128 | .. |
216| ✓ | __floatunsixf | u32 | ∅ | f80 | .. |
217| ✓ | __floatundihf | u64 | ∅ | f16 | .. |
218| ✓ | __floatundisf | u64 | ∅ | f32 | .. |
219| ✓ | __floatundidf | u64 | ∅ | f64 | .. |
220| ✓ | __floatunditf | u64 | ∅ | f128 | .. |
221| ✓ | __floatundixf | u64 | ∅ | f80 | .. |
222| ✓ | __floatuntihf | u128 | ∅ | f16 | .. |
223| ✓ | __floatuntisf | u128 | ∅ | f32 | .. |
224| ✓ | __floatuntidf | u128 | ∅ | f64 | .. |
225| ✓ | __floatuntitf | u128 | ∅ | f128 | .. |
226| ✓ | __floatuntixf | u128 | ∅ | f80 | .. |
227| | | | | | **Float Comparison** |
228| ✓ | __cmphf2 | f16 | f16 | i32 | `(a<b)->-1, (a==b)->0, (a>b)->1, Nan->1` |
229| ✓ | __cmpsf2 | f32 | f32 | i32 | exported from __lesf2, __ledf2, __letf2 (below) |
230| ✓ | __cmpdf2 | f64 | f64 | i32 | But: if NaN is a possibility, use another routine. |
231| ✓ | __cmptf2 | f128 | f128 | i32 | .. |
232| ✓ | __cmpxf2 | f80 | f80 | i32 | .. |
233| ✓ | _Qp_cmp |*f128 |*f128 | i32 | .. SPARC |
234| ✓ | __unordhf2 | f16 | f16 | i32 | `(a==+-NaN or b==+-NaN) -> !=0, else -> 0` |
235| ✓ | __unordsf2 | f32 | f32 | i32 | .. |
236| ✓ | __unorddf2 | f64 | f64 | i32 | Note: only reliable for (input!=NaN) |
237| ✓ | __unordtf2 | f128 | f128 | i32 | .. |
238| ✓ | __unordxf2 | f80 | f80 | i32 | .. |
239| ✓ | __aeabi_fcmpun | f32 | f32 | i32 | .. ARM |
240| ✓ | __aeabi_dcmpun | f32 | f32 | i32 | .. ARM |
241| ✓ | __unordkf2 | f128 | f128 | i32 | .. PPC |
242| ✓ | __eqhf2 | f16 | f16 | i32 | `(a!=NaN) and (b!=Nan) and (a==b) -> output=0` |
243| ✓ | __eqsf2 | f32 | f32 | i32 | .. |
244| ✓ | __eqdf2 | f64 | f64 | i32 | .. |
245| ✓ | __eqtf2 | f128 | f128 | i32 | .. |
246| ✓ | __eqxf2 | f80 | f80 | i32 | .. |
247| ✓ | __aeabi_fcmpeq | f32 | f32 | i32 | .. ARM |
248| ✓ | __aeabi_dcmpeq | f32 | f32 | i32 | .. ARM |
249| ✓ | __eqkf2 | f128 | f128 | i32 | .. PPC |
250| ✓ | _Qp_feq |*f128 |*f128 | bool | .. SPARC |
251| ✓ | __nehf2 | f16 | f16 | i32 | `(a==NaN) or (b==Nan) or (a!=b) -> output!=0` |
252| ✓ | __nesf2 | f32 | f32 | i32 | Note: __eqXf2 and __neXf2 have same return value |
253| ✓ | __nedf2 | f64 | f64 | i32 | .. |
254| ✓ | __netf2 | f128 | f128 | i32 | .. |
255| ✓ | __nexf2 | f80 | f80 | i32 | .. |
256| ✓ | __nekf2 | f128 | f128 | i32 | .. PPC |
257| ✓ | _Qp_fne |*f128 |*f128 | bool | .. SPARC |
258| ✓ | __gehf2 | f16 | f16 | i32 | `(a!=Nan) and (b!=Nan) and (a>=b) -> output>=0` |
259| ✓ | __gesf2 | f32 | f32 | i32 | .. |
260| ✓ | __gedf2 | f64 | f64 | i32 | .. |
261| ✓ | __getf2 | f128 | f128 | i32 | .. |
262| ✓ | __gexf2 | f80 | f80 | i32 | .. |
263| ✓ | __gekf2 | f128 | f128 | i32 | .. PPC |
264| ✓ | _Qp_fge |*f128 |*f128 | bool | .. SPARC |
265| ✓ | __lthf2 | f16 | f16 | i32 | `(a!=Nan) and (b!=Nan) and (a<b) -> output<0` |
266| ✓ | __ltsf2 | f32 | f32 | i32 | .. |
267| ✓ | __ltdf2 | f64 | f64 | i32 | .. |
268| ✓ | __lttf2 | f128 | f128 | i32 | .. |
269| ✓ | __ltxf2 | f80 | f80 | i32 | .. |
270| ✓ | __ltkf2 | f128 | f128 | i32 | .. PPC |
271| ✓ | __aeabi_fcmplt | f32 | f32 | i32 | .. ARM |
272| ✓ | __aeabi_dcmplt | f32 | f32 | i32 | .. ARM |
273| ✓ | _Qp_flt |*f128 |*f128 | bool | .. SPARC |
274| ✓ | __lehf2 | f16 | f16 | i32 | `(a!=Nan) and (b!=Nan) and (a<=b) -> output<=0` |
275| ✓ | __lesf2 | f32 | f32 | i32 | .. |
276| ✓ | __ledf2 | f64 | f64 | i32 | .. |
277| ✓ | __letf2 | f128 | f128 | i32 | .. |
278| ✓ | __lexf2 | f80 | f80 | i32 | .. |
279| ✓ | __aeabi_fcmple | f32 | f32 | i32 | .. ARM |
280| ✓ | __aeabi_dcmple | f32 | f32 | i32 | .. ARM |
281| ✓ | __lekf2 | f128 | f128 | i32 | .. PPC |
282| ✓ | _Qp_fle |*f128 |*f128 | bool | .. SPARC |
283| ✓ | __gthf2 | f16 | f16 | i32 | `(a!=Nan) and (b!=Nan) and (a>b) -> output>0` |
284| ✓ | __gtsf2 | f32 | f32 | i32 | .. |
285| ✓ | __gtdf2 | f64 | f64 | i32 | .. |
286| ✓ | __gttf2 | f128 | f128 | i32 | .. |
287| ✓ | __gtxf2 | f80 | f80 | i32 | .. |
288| ✓ | __gtkf2 | f128 | f128 | i32 | .. PPC |
289| ✓ | _Qp_fgt |*f128 |*f128 | bool | .. SPARC |
290| | | | | | **Float Arithmetic** |
291| ✓ | __addhf3 | f32 | f32 | f32 | `a + b` |
292| ✓ | __addsf3 | f32 | f32 | f32 | .. |
293| ✓ | __adddf3 | f64 | f64 | f64 | .. |
294| ✓ | __addtf3 | f128 | f128 | f128 | .. |
295| ✓ | __addxf3 | f80 | f80 | f80 | .. |
296| ✓ | __aeabi_fadd | f32 | f32 | f32 | .. ARM |
297| ✓ | __aeabi_dadd | f64 | f64 | f64 | .. ARM |
298| ✓ | __addkf3 | f128 | f128 | f128 | .. PPC |
299| ✓ | _Qp_add |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a+b |
300| ✓ | __subhf3 | f32 | f32 | f32 | `a - b` |
301| ✓ | __subsf3 | f32 | f32 | f32 | .. |
302| ✓ | __subdf3 | f64 | f64 | f64 | .. |
303| ✓ | __subtf3 | f128 | f128 | f128 | .. |
304| ✓ | __subxf3 | f80 | f80 | f80 | .. |
305| ✓ | __aeabi_fsub | f32 | f32 | f32 | .. ARM |
306| ✓ | __aeabi_dsub | f64 | f64 | f64 | .. ARM |
307| ✓ | __subkf3 | f128 | f128 | f128 | .. PPC |
308| ✓ | _Qp_sub |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a-b |
309| ✓ | __mulhf3 | f32 | f32 | f32 | `a * b` |
310| ✓ | __mulsf3 | f32 | f32 | f32 | .. |
311| ✓ | __muldf3 | f64 | f64 | f64 | .. |
312| ✓ | __multf3 | f128 | f128 | f128 | .. |
313| ✓ | __mulxf3 | f80 | f80 | f80 | .. |
314| ✓ | __aeabi_fmul | f32 | f32 | f32 | .. ARM |
315| ✓ | __aeabi_dmul | f64 | f64 | f64 | .. ARM |
316| ✓ | __mulkf3 | f128 | f128 | f128 | .. PPC |
317| ✓ | _Qp_mul |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a*b |
318| ✓ | __divsf3 | f32 | f32 | f32 | `a / b` |
319| ✓ | __divdf3 | f64 | f64 | f64 | .. |
320| ✓ | __divtf3 | f128 | f128 | f128 | .. |
321| ✓ | __divxf3 | f80 | f80 | f80 | .. |
322| ✓ | __aeabi_fdiv | f32 | f32 | f32 | .. ARM |
323| ✓ | __aeabi_ddiv | f64 | f64 | f64 | .. ARM |
324| ✓ | __divkf3 | f128 | f128 | f128 | .. PPC |
325| ✓ | _Qp_div |*f128 |*f128 | void | .. SPARC args *c,*a,*b c=a*b |
326| ✓ | __negsf2 | f32 | ∅ | f32[^unused_rl78] | -a (can be lowered directly to a xor) |
327| ✓ | __negdf2 | f64 | ∅ | f64 | .. |
328| ✓ | __negtf2 | f128 | ∅ | f128 | .. |
329| ✓ | __negxf2 | f80 | ∅ | f80 | .. |
330| | | | | | **Floating point raised to integer power** |
331| ✗ | __powihf2 | f16 | f16 | f16 | `a ^ b` |
332| ✗ | __powisf2 | f32 | f32 | f32 | .. |
333| ✗ | __powidf2 | f64 | f64 | f64 | .. |
334| ✗ | __powitf2 | f128 | f128 | f128 | .. |
335| ✗ | __powixf2 | f80 | f80 | f80 | .. |
336| ✓ | __mulhc3 | all4 | f16 | f16 | `(a+ib) * (c+id)` |
337| ✓ | __mulsc3 | all4 | f32 | f32 | .. |
338| ✓ | __muldc3 | all4 | f64 | f64 | .. |
339| ✓ | __multc3 | all4 | f128 | f128 | .. |
340| ✓ | __mulxc3 | all4 | f80 | f80 | .. |
341| ✓ | __divhc3 | all4 | f16 | f16 | `(a+ib) / (c+id)` |
342| ✓ | __divsc3 | all4 | f32 | f32 | .. |
343| ✓ | __divdc3 | all4 | f64 | f64 | .. |
344| ✓ | __divtc3 | all4 | f128 | f128 | .. |
345| ✓ | __divxc3 | all4 | f80 | f80 | .. |
346
347[^unused_rl78]: Unused in LLVM, but used for example by rl78.
348[^libgcc_compat]: Unused in backends and for symbol-level compatibility with libgcc.
349[^noptr_faster]: Operations without pointer and without C struct semantics lead to better optimizations.
350[^perf_addition]: Has better performance than standard method due to 2s complement semantics.
351Not provided by LLVM and libgcc.
352
353Decimal float library routines
283354
284355BID means Binary Integer Decimal encoding, DPD means Densely Packed Decimal encoding.
285356BID should be only chosen for binary data, DPD for decimal data (ASCII, Unicode etc).
286If possible, use BCD instead of DPD to represent numbers not accurately representable
287in binary like the number 0.2.
288
289All routines are TODO.
290
291#### Decimal float Conversion
292
293- __dpd_extendsddd2 // dec32->dec64
294- __bid_extendsddd2 // dec32->dec64
295- __dpd_extendsdtd2 // dec32->dec128
296- __bid_extendsdtd2 // dec32->dec128
297- __dpd_extendddtd2 // dec64->dec128
298- __bid_extendddtd2 // dec64->dec128
299- __dpd_truncddsd2 // dec64->dec32
300- __bid_truncddsd2 // dec64->dec32
301- __dpd_trunctdsd2 // dec128->dec32
302- __bid_trunctdsd2 // dec128->dec32
303- __dpd_trunctddd2 // dec128->dec64
304- __bid_trunctddd2 // dec128->dec64
305
306- __dpd_extendsfdd // float->dec64
307- __bid_extendsfdd // float->dec64
308- __dpd_extendsftd // float->dec128
309- __bid_extendsftd // float->dec128
310- __dpd_extenddftd // double->dec128
311- __bid_extenddftd // double->dec128
312- __dpd_extendxftd // long double->dec128
313- __bid_extendxftd // long double->dec128
314- __dpd_truncdfsd // double->dec32
315- __bid_truncdfsd // double->dec32
316- __dpd_truncxfsd // long double->dec32
317- __bid_truncxfsd // long double->dec32
318- __dpd_trunctfsd // long double->dec32
319- __bid_trunctfsd // long double->dec32
320- __dpd_truncxfdd // long double->dec64
321- __bid_truncxfdd // long double->dec64
322- __dpd_trunctfdd // long double->dec64
323- __bid_trunctfdd // long double->dec64
324
325- __dpd_truncddsf // dec64->float
326- __bid_truncddsf // dec64->float
327- __dpd_trunctdsf // dec128->float
328- __bid_trunctdsf // dec128->float
329- __dpd_extendsddf // dec32->double
330- __bid_extendsddf // dec32->double
331- __dpd_trunctddf // dec128->double
332- __bid_trunctddf // dec128->double
333- __dpd_extendsdxf // dec32->long double
334- __bid_extendsdxf // dec32->long double
335- __dpd_extendddxf // dec64->long double
336- __bid_extendddxf // dec64->long double
337- __dpd_trunctdxf // dec128->long double
338- __bid_trunctdxf // dec128->long double
339- __dpd_extendsdtf // dec32->long double
340- __bid_extendsdtf // dec32->long double
341- __dpd_extendddtf // dec64->long double
342- __bid_extendddtf // dec64->long double
343
344Same size conversion:
345- __dpd_extendsfsd // float->dec32
346- __bid_extendsfsd // float->dec32
347- __dpd_extenddfdd // double->dec64
348- __bid_extenddfdd // double->dec64
349- __dpd_extendtftd //long double->dec128
350- __bid_extendtftd //long double->dec128
351- __dpd_truncsdsf // dec32->float
352- __bid_truncsdsf // dec32->float
353- __dpd_truncdddf // dec64->float
354- __bid_truncdddf // dec64->float
355- __dpd_trunctdtf // dec128->long double
356- __bid_trunctdtf // dec128->long double
357
358- __dpd_fixsdsi // dec32->int
359- __bid_fixsdsi // dec32->int
360- __dpd_fixddsi // dec64->int
361- __bid_fixddsi // dec64->int
362- __dpd_fixtdsi // dec128->int
363- __bid_fixtdsi // dec128->int
364
365- __dpd_fixsddi // dec32->long
366- __bid_fixsddi // dec32->long
367- __dpd_fixdddi // dec64->long
368- __bid_fixdddi // dec64->long
369- __dpd_fixtddi // dec128->long
370- __bid_fixtddi // dec128->long
371
372- __dpd_fixunssdsi // dec32->unsigned int, All negative values become zero.
373- __bid_fixunssdsi // dec32->unsigned int
374- __dpd_fixunsddsi // dec64->unsigned int
375- __bid_fixunsddsi // dec64->unsigned int
376- __dpd_fixunstdsi // dec128->unsigned int
377- __bid_fixunstdsi // dec128->unsigned int
378
379- __dpd_fixunssddi // dec32->unsigned long, All negative values become zero.
380- __bid_fixunssddi // dec32->unsigned long
381- __dpd_fixunsdddi // dec64->unsigned long
382- __bid_fixunsdddi // dec64->unsigned long
383- __dpd_fixunstddi // dec128->unsigned long
384- __bid_fixunstddi // dec128->unsigned long
385
386- __dpd_floatsisd // int->dec32
387- __bid_floatsisd // int->dec32
388- __dpd_floatsidd // int->dec64
389- __bid_floatsidd // int->dec64
390- __dpd_floatsitd // int->dec128
391- __bid_floatsitd // int->dec128
392
393- __dpd_floatdisd // long->dec32
394- __bid_floatdisd // long->dec32
395- __dpd_floatdidd // long->dec64
396- __bid_floatdidd // long->dec64
397- __dpd_floatditd // long->dec128
398- __bid_floatditd // long->dec128
399
400- __dpd_floatunssisd // unsigned int->dec32
401- __bid_floatunssisd // unsigned int->dec32
402- __dpd_floatunssidd // unsigned int->dec64
403- __bid_floatunssidd // unsigned int->dec64
404- __dpd_floatunssitd // unsigned int->dec128
405- __bid_floatunssitd // unsigned int->dec128
406
407- __dpd_floatunsdisd // unsigned long->dec32
408- __bid_floatunsdisd // unsigned long->dec32
409- __dpd_floatunsdidd // unsigned long->dec64
410- __bid_floatunsdidd // unsigned long->dec64
411- __dpd_floatunsditd // unsigned long->dec128
412- __bid_floatunsditd // unsigned long->dec128
413
414#### Decimal float Comparison
415
416All decimal float comparison routines return c_int.
417
418- __dpd_unordsd2 // a,b: dec32, a +-NaN or a +-NaN -> 1(nonzero), else -> 0
419- __bid_unordsd2 // a,b: dec32
420- __dpd_unorddd2 // a,b: dec64
421- __bid_unorddd2 // a,b: dec64
422- __dpd_unordtd2 // a,b: dec128
423- __bid_unordtd2 // a,b: dec128
424
425- __dpd_eqsd2 // a,b: dec32, a!=+-NaN and b!=+-Nan and a==b -> 0, else -> 1(nonzero)
426- __bid_eqsd2 // a,b: dec32
427- __dpd_eqdd2 // a,b: dec64
428- __bid_eqdd2 // a,b: dec64
429- __dpd_eqtd2 // a,b: dec128
430- __bid_eqtd2 // a,b: dec128
431
432- __dpd_nesd2 // a,b: dec32, a==+-NaN or b==+-NaN or a!=b -> 1(nonzero), else -> 0
433- __bid_nesd2 // a,b: dec32
434- __dpd_nedd2 // a,b: dec64
435- __bid_nedd2 // a,b: dec64
436- __dpd_netd2 // a,b: dec128
437- __bid_netd2 // a,b: dec128
438
439- __dpd_gesd2 // a,b: dec32, a!=+-NaN and b!=+-NaN and a>=b -> >=0, else -> <0
440- __bid_gesd2 // a,b: dec32
441- __dpd_gedd2 // a,b: dec64
442- __bid_gedd2 // a,b: dec64
443- __dpd_getd2 // a,b: dec128
444- __bid_getd2 // a,b: dec128
445
446- __dpd_ltsd2 // a,b: dec32, a!=+-NaN and b!=+-NaN and a<b -> <0, else -> >=0
447- __bid_ltsd2 // a,b: dec32
448- __dpd_ltdd2 // a,b: dec64
449- __bid_ltdd2 // a,b: dec64
450- __dpd_lttd2 // a,b: dec128
451- __bid_lttd2 // a,b: dec128
452
453- __dpd_lesd2 // a,b: dec32, a!=+-NaN and b!=+-NaN and a<=b -> <=0, else -> >=0
454- __bid_lesd2 // a,b: dec32
455- __dpd_ledd2 // a,b: dec64
456- __bid_ledd2 // a,b: dec64
457- __dpd_letd2 // a,b: dec128
458- __bid_letd2 // a,b: dec128
459
460- __dpd_gtsd2 // a,b: dec32, a!=+-NaN and b!=+-NaN and a>b -> >0, else -> <=0
461- __bid_gtsd2 // a,b: dec32
462- __dpd_gtdd2 // a,b: dec64
463- __bid_gtdd2 // a,b: dec64
464- __dpd_gttd2 // a,b: dec128
465- __bid_gttd2 // a,b: dec128
466
467#### Decimal float Arithmetic
468
469These numbers include options with routines for +-0 and +-Nan.
470
471- __dpd_addsd3 // a,b: dec32 -> dec32, a + b
472- __bid_addsd3 // a,b: dec32 -> dec32
473- __dpd_adddd3 // a,b: dec64 -> dec64
474- __bid_adddd3 // a,b: dec64 -> dec64
475- __dpd_addtd3 // a,b: dec128-> dec128
476- __bid_addtd3 // a,b: dec128-> dec128
477- __dpd_subsd3 // a,b: dec32, a - b
478- __bid_subsd3 // a,b: dec32 -> dec32
479- __dpd_subdd3 // a,b: dec64 ..
480- __bid_subdd3 // a,b: dec64
481- __dpd_subtd3 // a,b: dec128
482- __bid_subtd3 // a,b: dec128
483- __dpd_mulsd3 // a,b: dec32, a * b
484- __bid_mulsd3 // a,b: dec32 -> dec32
485- __dpd_muldd3 // a,b: dec64 ..
486- __bid_muldd3 // a,b: dec64
487- __dpd_multd3 // a,b: dec128
488- __bid_multd3 // a,b: dec128
489- __dpd_divsd3 // a,b: dec32, a / b
490- __bid_divsd3 // a,b: dec32 -> dec32
491- __dpd_divdd3 // a,b: dec64 ..
492- __bid_divdd3 // a,b: dec64
493- __dpd_divtd3 // a,b: dec128
494- __bid_divtd3 // a,b: dec128
495- __dpd_negsd2 // a,b: dec32, -a
496- __bid_negsd2 // a,b: dec32 -> dec32
497- __dpd_negdd2 // a,b: dec64 ..
498- __bid_negdd2 // a,b: dec64
499- __dpd_negtd2 // a,b: dec128
500- __bid_negtd2 // a,b: dec128
501
502## Fixed-point fractional library routines
503
504TODO
505
506Too unclear for work items:
507- Miscellaneous routines => unclear, if supported (cache control and stack functions)
508- Zig-specific language runtime features, for example "Arbitrary length integer library routines"
357For example the number 0.2 is not accurately representable in binary data.
358
359| Done | Name | a | b | Out | Comment |
360| ------ | ------------- | --------- | --------- | --------- | ---------------------------- |
361| | | | | | **Decimal Float Conversion** |
362| ✗ | __dpd_extendsddd2 | dec32 | ∅ | dec64 | conversion |
363| ✗ | __bid_extendsddd2 | dec32 | ∅ | dec64 | .. |
364| ✗ | __dpd_extendsdtd2 | dec32 | ∅ | dec128| .. |
365| ✗ | __bid_extendsdtd2 | dec32 | ∅ | dec128| .. |
366| ✗ | __dpd_extendddtd2 | dec64 | ∅ | dec128| .. |
367| ✗ | __bid_extendddtd2 | dec64 | ∅ | dec128| .. |
368| ✗ | __dpd_truncddsd2 | dec64 | ∅ | dec32 | .. |
369| ✗ | __bid_truncddsd2 | dec64 | ∅ | dec32 | .. |
370| ✗ | __dpd_trunctdsd2 | dec128 | ∅ | dec32 | .. |
371| ✗ | __bid_trunctdsd2 | dec128 | ∅ | dec32 | .. |
372| ✗ | __dpd_trunctddd2 | dec128 | ∅ | dec64 | .. |
373| ✗ | __bid_trunctddd2 | dec128 | ∅ | dec64 | .. |
374| ✗ | __dpd_extendsfdd | float | ∅ | dec64 | .. |
375| ✗ | __bid_extendsfdd | float | ∅ | dec64 | .. |
376| ✗ | __dpd_extendsftd | float | ∅ | dec128| .. |
377| ✗ | __bid_extendsftd | float | ∅ | dec128| .. |
378| ✗ | __dpd_extenddftd | double | ∅ | dec128| .. |
379| ✗ | __bid_extenddftd | double | ∅ | dec128| .. |
380| ✗ | __dpd_extendxftd |long double | ∅ | dec128| .. |
381| ✗ | __bid_extendxftd |long double | ∅ | dec128| .. |
382| ✗ | __dpd_truncdfsd | double | ∅ | dec32 | .. |
383| ✗ | __bid_truncdfsd | double | ∅ | dec32 | .. |
384| ✗ | __dpd_truncxfsd |long double | ∅ | dec32 | .. |
385| ✗ | __bid_truncxfsd |long double | ∅ | dec32 | .. |
386| ✗ | __dpd_trunctfsd |long double | ∅ | dec32 | .. |
387| ✗ | __bid_trunctfsd |long double | ∅ | dec32 | .. |
388| ✗ | __dpd_truncxfdd |long double | ∅ | dec64 | .. |
389| ✗ | __bid_truncxfdd |long double | ∅ | dec64 | .. |
390| ✗ | __dpd_trunctfdd |long double | ∅ | dec64 | .. |
391| ✗ | __bid_trunctfdd |long double | ∅ | dec64 | .. |
392| ✗ | __dpd_truncddsf | dec64 | ∅ | float | .. |
393| ✗ | __bid_truncddsf | dec64 | ∅ | float | .. |
394| ✗ | __dpd_trunctdsf | dec128 | ∅ | float | .. |
395| ✗ | __bid_trunctdsf | dec128 | ∅ | float | .. |
396| ✗ | __dpd_extendsddf | dec32 | ∅ | double| .. |
397| ✗ | __bid_extendsddf | dec32 | ∅ | double| .. |
398| ✗ | __dpd_trunctddf | dec128 | ∅ | double| .. |
399| ✗ | __bid_trunctddf | dec128 | ∅ | double| .. |
400| ✗ | __dpd_extendsdxf | dec32 | ∅ |long double| .. |
401| ✗ | __bid_extendsdxf | dec32 | ∅ |long double| .. |
402| ✗ | __dpd_extendddxf | dec64 | ∅ |long double| .. |
403| ✗ | __bid_extendddxf | dec64 | ∅ |long double| .. |
404| ✗ | __dpd_trunctdxf | dec128 | ∅ |long double| .. |
405| ✗ | __bid_trunctdxf | dec128 | ∅ |long double| .. |
406| ✗ | __dpd_extendsdtf | dec32 | ∅ |long double| .. |
407| ✗ | __bid_extendsdtf | dec32 | ∅ |long double| .. |
408| ✗ | __dpd_extendddtf | dec64 | ∅ |long double| .. |
409| ✗ | __bid_extendddtf | dec64 | ∅ |long double| .. |
410| ✗ | __dpd_extendsfsd | float | ∅ | dec32 | same size conversions |
411| ✗ | __bid_extendsfsd | float | ∅ | dec32 | .. |
412| ✗ | __dpd_extenddfdd | double | ∅ | dec64 | .. |
413| ✗ | __bid_extenddfdd | double | ∅ | dec64 | .. |
414| ✗ | __dpd_extendtftd |long double | ∅ | dec128| .. |
415| ✗ | __bid_extendtftd |long double | ∅ | dec128| .. |
416| ✗ | __dpd_truncsdsf | dec32 | ∅ | float | .. |
417| ✗ | __bid_truncsdsf | dec32 | ∅ | float | .. |
418| ✗ | __dpd_truncdddf | dec64 | ∅ | float | conversion |
419| ✗ | __bid_truncdddf | dec64 | ∅ | float | .. |
420| ✗ | __dpd_trunctdtf | dec128 | ∅ |long double| .. |
421| ✗ | __bid_trunctdtf | dec128 | ∅ |long double| .. |
422| ✗ | __dpd_fixsdsi | dec32 | ∅ | int | .. |
423| ✗ | __bid_fixsdsi | dec32 | ∅ | int | .. |
424| ✗ | __dpd_fixddsi | dec64 | ∅ | int | .. |
425| ✗ | __bid_fixddsi | dec64 | ∅ | int | .. |
426| ✗ | __dpd_fixtdsi | dec128 | ∅ | int | .. |
427| ✗ | __bid_fixtdsi | dec128 | ∅ | int | .. |
428| ✗ | __dpd_fixsddi | dec32 | ∅ | long | .. |
429| ✗ | __bid_fixsddi | dec32 | ∅ | long | .. |
430| ✗ | __dpd_fixdddi | dec64 | ∅ | long | .. |
431| ✗ | __bid_fixdddi | dec64 | ∅ | long | .. |
432| ✗ | __dpd_fixtddi | dec128 | ∅ | long | .. |
433| ✗ | __bid_fixtddi | dec128 | ∅ | long | .. |
434| ✗ | __dpd_fixunssdsi | dec32 | ∅ |unsigned int | .. All negative values become zero. |
435| ✗ | __bid_fixunssdsi | dec32 | ∅ |unsigned int | .. |
436| ✗ | __dpd_fixunsddsi | dec64 | ∅ |unsigned int | .. |
437| ✗ | __bid_fixunsddsi | dec64 | ∅ |unsigned int | .. |
438| ✗ | __dpd_fixunstdsi | dec128 | ∅ |unsigned int | .. |
439| ✗ | __bid_fixunstdsi | dec128 | ∅ |unsigned int | .. |
440| ✗ | __dpd_fixunssddi | dec32 | ∅ |unsigned long| .. |
441| ✗ | __bid_fixunssddi | dec32 | ∅ |unsigned long| .. |
442| ✗ | __dpd_fixunsdddi | dec64 | ∅ |unsigned long| .. |
443| ✗ | __bid_fixunsdddi | dec64 | ∅ |unsigned long| .. |
444| ✗ | __dpd_fixunstddi | dec128 | ∅ |unsigned long| .. |
445| ✗ | __bid_fixunstddi | dec128 | ∅ |unsigned long| .. |
446| ✗ | __dpd_floatsisd | int | ∅ | dec32 | .. |
447| ✗ | __bid_floatsisd | int | ∅ | dec32 | .. |
448| ✗ | __dpd_floatsidd | int | ∅ | dec64 | .. |
449| ✗ | __bid_floatsidd | int | ∅ | dec64 | .. |
450| ✗ | __dpd_floatsitd | int | ∅ | dec128 | .. |
451| ✗ | __bid_floatsitd | int | ∅ | dec128 | .. |
452| ✗ | __dpd_floatdisd | long | ∅ | dec32 | .. |
453| ✗ | __bid_floatdisd | long | ∅ | dec32 | .. |
454| ✗ | __dpd_floatdidd | long | ∅ | dec64 | .. |
455| ✗ | __bid_floatdidd | long | ∅ | dec64 | .. |
456| ✗ | __dpd_floatditd | long | ∅ | dec128 | .. |
457| ✗ | __bid_floatditd | long | ∅ | dec128 | .. |
458| ✗ | __dpd_floatunssisd | unsigned int| ∅ | dec32 | .. |
459| ✗ | __bid_floatunssisd | unsigned int| ∅ | dec32 | .. |
460| ✗ | __dpd_floatunssidd | unsigned int| ∅ | dec64 | .. |
461| ✗ | __bid_floatunssidd | unsigned int| ∅ | dec64 | .. |
462| ✗ | __dpd_floatunssitd | unsigned int| ∅ | dec128 | .. |
463| ✗ | __bid_floatunssitd | unsigned int| ∅ | dec128 | .. |
464| ✗ | __dpd_floatunsdisd |unsigned long| ∅ | dec32 | .. |
465| ✗ | __bid_floatunsdisd |unsigned long| ∅ | dec32 | .. |
466| ✗ | __dpd_floatunsdidd |unsigned long| ∅ | dec64 | .. |
467| ✗ | __bid_floatunsdidd |unsigned long| ∅ | dec64 | .. |
468| ✗ | __dpd_floatunsditd |unsigned long| ∅ | dec128 | .. |
469| ✗ | __bid_floatunsditd |unsigned long| ∅ | dec128 | .. |
470| | | | | | **Decimal Float Comparison** |
471| ✗ | __dpd_unordsd2 | dec32 | dec32 | c_int | `a +-NaN or a +-NaN -> 1(nonzero), else -> 0` |
472| ✗ | __bid_unordsd2 | dec32 | dec32 | c_int | .. |
473| ✗ | __dpd_unorddd2 | dec64 | dec64 | c_int | .. |
474| ✗ | __bid_unorddd2 | dec64 | dec64 | c_int | .. |
475| ✗ | __dpd_unordtd2 | dec128 | dec128 | c_int | .. |
476| ✗ | __bid_unordtd2 | dec128 | dec128 | c_int | .. |
477| ✗ | __dpd_eqsd2 | dec32 | dec32 | c_int |`a!=+-NaN and b!=+-Nan and a==b -> 0, else -> 1(nonzero)`|
478| ✗ | __bid_eqsd2 | dec32 | dec32 | c_int | .. |
479| ✗ | __dpd_eqdd2 | dec64 | dec64 | c_int | .. |
480| ✗ | __bid_eqdd2 | dec64 | dec64 | c_int | .. |
481| ✗ | __dpd_eqtd2 | dec128 | dec128 | c_int | .. |
482| ✗ | __bid_eqtd2 | dec128 | dec128 | c_int | .. |
483| ✗ | __dpd_nesd2 | dec32 | dec32 | c_int | `a==+-NaN or b==+-NaN or a!=b -> 1(nonzero), else -> 0` |
484| ✗ | __bid_nesd2 | dec32 | dec32 | c_int | .. |
485| ✗ | __dpd_nedd2 | dec64 | dec64 | c_int | .. |
486| ✗ | __bid_nedd2 | dec64 | dec64 | c_int | .. |
487| ✗ | __dpd_netd2 | dec128 | dec128 | c_int | .. |
488| ✗ | __bid_netd2 | dec128 | dec128 | c_int | .. |
489| ✗ | __dpd_gesd2 | dec32 | dec32 | c_int | `a!=+-NaN and b!=+-NaN and a>=b -> >=0, else -> <0` |
490| ✗ | __bid_gesd2 | dec32 | dec32 | c_int | .. |
491| ✗ | __dpd_gedd2 | dec64 | dec64 | c_int | .. |
492| ✗ | __bid_gedd2 | dec64 | dec64 | c_int | .. |
493| ✗ | __dpd_getd2 | dec128 | dec128 | c_int | .. |
494| ✗ | __bid_getd2 | dec128 | dec128 | c_int | .. |
495| ✗ | __dpd_ltsd2 | dec32 | dec32 | c_int | `a!=+-NaN and b!=+-NaN and a<b -> <0, else -> >=0` |
496| ✗ | __bid_ltsd2 | dec32 | dec32 | c_int | .. |
497| ✗ | __dpd_ltdd2 | dec64 | dec64 | c_int | .. |
498| ✗ | __bid_ltdd2 | dec64 | dec64 | c_int | .. |
499| ✗ | __dpd_lttd2 | dec128 | dec128 | c_int | .. |
500| ✗ | __bid_lttd2 | dec128 | dec128 | c_int | .. |
501| ✗ | __dpd_lesd2 | dec32 | dec32 | c_int | `a!=+-NaN and b!=+-NaN and a<=b -> <=0, else -> >=0` |
502| ✗ | __bid_lesd2 | dec32 | dec32 | c_int | .. |
503| ✗ | __dpd_ledd2 | dec64 | dec64 | c_int | .. |
504| ✗ | __bid_ledd2 | dec64 | dec64 | c_int | .. |
505| ✗ | __dpd_letd2 | dec128 | dec128 | c_int | .. |
506| ✗ | __bid_letd2 | dec128 | dec128 | c_int | .. |
507| ✗ | __dpd_gtsd2 | dec32 | dec32 | c_int | `a!=+-NaN and b!=+-NaN and a>b -> >0, else -> <=0` |
508| ✗ | __bid_gtsd2 | dec32 | dec32 | c_int | .. |
509| ✗ | __dpd_gtdd2 | dec64 | dec64 | c_int | .. |
510| ✗ | __bid_gtdd2 | dec64 | dec64 | c_int | .. |
511| ✗ | __dpd_gttd2 | dec128 | dec128 | c_int | .. |
512| ✗ | __bid_gttd2 | dec128 | dec128 | c_int | .. |
513| | | | | | **Decimal Float Arithmetic**[^options] |
514| ✗ | __dpd_addsd3 | dec32 | dec32 | dec32 |`a + b`|
515| ✗ | __bid_addsd3 | dec32 | dec32 | dec32 | .. |
516| ✗ | __dpd_adddd3 | dec64 | dec64 | dec64 | .. |
517| ✗ | __bid_adddd3 | dec64 | dec64 | dec64 | .. |
518| ✗ | __dpd_addtd3 | dec128 | dec128 | dec128 | .. |
519| ✗ | __bid_addtd3 | dec128 | dec128 | dec128 | .. |
520| ✗ | __dpd_subsd3 | dec32 | dec32 | dec32 |`a - b`|
521| ✗ | __bid_subsd3 | dec32 | dec32 | dec32 | .. |
522| ✗ | __dpd_subdd3 | dec64 | dec64 | dec64 | .. |
523| ✗ | __bid_subdd3 | dec64 | dec64 | dec64 | .. |
524| ✗ | __dpd_subtd3 | dec128 | dec128 | dec128 | .. |
525| ✗ | __bid_subtd3 | dec128 | dec128 | dec128 | .. |
526| ✗ | __dpd_mulsd3 | dec32 | dec32 | dec32 |`a * b`|
527| ✗ | __bid_mulsd3 | dec32 | dec32 | dec32 | .. |
528| ✗ | __dpd_muldd3 | dec64 | dec64 | dec64 | .. |
529| ✗ | __bid_muldd3 | dec64 | dec64 | dec64 | .. |
530| ✗ | __dpd_multd3 | dec128 | dec128 | dec128 | .. |
531| ✗ | __bid_multd3 | dec128 | dec128 | dec128 | .. |
532| ✗ | __dpd_divsd3 | dec32 | dec32 | dec32 |`a / b`|
533| ✗ | __bid_divsd3 | dec32 | dec32 | dec32 | .. |
534| ✗ | __dpd_divdd3 | dec64 | dec64 | dec64 | .. |
535| ✗ | __bid_divdd3 | dec64 | dec64 | dec64 | .. |
536| ✗ | __dpd_divtd3 | dec128 | dec128 | dec128 | .. |
537| ✗ | __bid_divtd3 | dec128 | dec128 | dec128 | .. |
538| ✗ | __dpd_negsd2 | dec32 | dec32 | dec32 | `-a` |
539| ✗ | __bid_negsd2 | dec32 | dec32 | dec32 | .. |
540| ✗ | __dpd_negdd2 | dec64 | dec64 | dec64 | .. |
541| ✗ | __bid_negdd2 | dec64 | dec64 | dec64 | .. |
542| ✗ | __dpd_negtd2 | dec128 | dec128 | dec128 | .. |
543| ✗ | __bid_negtd2 | dec128 | dec128 | dec128 | .. |
544
545[^options]: These numbers include options with routines for +-0 and +-Nan.
546
547Fixed-point fractional library routines
548
549TODO brief explanation + implementation
550
551| Done | Name | a | b | Out | Comment |
552| ------ | ------------- | --------- | --------- | --------- | -------------------------- |
553| | | | | | **Fixed-Point Fractional** |
554
555Further content:
556- aarch64 outline atomics
557- atomics
558- msvc things like _alldiv, _aulldiv, _allrem
559- clear cache
560- tls emulation
561- math routines (cos, sin, tan, ceil, floor, exp, exp2, fabs, log, log10, log2, sincos, sqrt)
562- bcmp
563- ieee float routines (fma, fmax, fmin, fmod, fabs, float rounding, )
564- arm routines (memory routines + memclr [setting to 0], divmod routines and stubs for unwind_cpp)
565- memory routines (memcmp, memcpy, memset, memmove)
566- objective-c __isPlatformVersionAtLeast check
567- stack probe routines
568
569Future work
570
571Arbitrary length integer library routines