authorgravatar for jan.hafer@rwth-aachen.deJan Philipp Hafer <jan.hafer@rwth-aachen.de> 2022-10-22 17:33:01+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-10-22 09:23:50-07:00
log776f7de9673087597e1a549d3567c18c43c800ab
treecc8ae01aeb1b99473cf22cf1c24c430a860926c3
parent10b8c4d8f02c085090b07f3709de2d70d3b85cf0

update compiler_rt README and prettify it

This documents status of routines and adds the next work item "Decimal float library routines", which are only recommended for binary data. Complete absence of tests is also documented. This does not document the various aliases, e.g. those for ARM. Missing Integer library routines: - __addvsi3 - __addvdi3 - __addvti3 - __addvdi3 - __addvti3 - __subvsi3 - __subvdi3 - __subvti3 - __subvdi3 - __subvti3 - __mulvsi3 - __mulvdi3 - __mulvti3 - __mulvdi3 - __mulvti3 Missing floating library routines: - __powisf2 - __powidf2 - __powitf2 - __powixf2 Missing routines for symbol-level compatibility to gcc: - __ashlsi3 - __ashrsi3 - __lshrsi3

1 files changed, 425 insertions(+), 184 deletions(-)

lib/compiler_rt/README.md+425-184
......@@ -15,7 +15,7 @@ Goals:
1515
1616Current status (tracking libgcc documentation):
1717- Integer library routines => almost implemented
18- Soft float library routines => only f80 routines missing
18- Soft float library routines => finished
1919- Decimal float library routines => unimplemented (~120 functions)
2020- Fixed-point fractional library routines => unimplemented (~300 functions)
2121- Exception handling routines => unclear, if supported (~32+x undocumented functions)
......@@ -48,66 +48,71 @@ Bugs should be solved by trying to duplicate the bug upstream, if possible.
4848## Integer library routines
4949
5050#### Integer Bit operations
51- dev HackersDelight __clzsi2 // count leading zeros
52- dev HackersDelight __clzdi2 // count leading zeros
53- dev HackersDelight __clzti2 // count leading zeros
54- dev HackersDelight __ctzsi2 // count trailing zeros
55- dev HackersDelight __ctzdi2 // count trailing zeros
56- dev HackersDelight __ctzti2 // count trailing zeros
57- dev __ctzsi2 __ffssi2 // find least significant 1 bit
58- dev __ctzsi2 __ffsdi2 // find least significant 1 bit
59- dev __ctzsi2 __ffsti2 // find least significant 1 bit
60- dev BitTwiddlingHacks __paritysi2 // bit parity
61- dev BitTwiddlingHacks __paritydi2 // bit parity
62- dev BitTwiddlingHacks __parityti2 // bit parity
63- dev TAOCP __popcountsi2 // bit population
64- dev TAOCP __popcountdi2 // bit population
65- dev TAOCP __popcountti2 // bit population
66- dev other __bswapsi2 // a byteswapped
67- dev other __bswapdi2 // a byteswapped
68- dev other __bswapti2 // a byteswapped
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
6970
7071#### Integer Comparison
71- port llvm __cmpsi2 // (a<b)=>output=0, (a==b)=>output=1, (a>b)=>output=2
72- port llvm __cmpdi2
73- port llvm __cmpti2
74- port llvm __ucmpsi2 // (a<b)=>output=0, (a==b)=>output=1, (a>b)=>output=2
75- port llvm __ucmpdi2
76- port llvm __ucmpti2
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
7779
7880#### Integer Arithmetic
79- none none __ashlsi3 // a << b unused in llvm, missing (e.g. used by rl78)
80- port llvm __ashldi3 // a << b
81- port llvm __ashlti3 // a << b
82- none none __ashrsi3 // a >> b arithmetic (sign fill) missing (e.g. used by rl78)
83- port llvm __ashrdi3 // a >> b arithmetic (sign fill)
84- port llvm __ashrti3 // a >> b arithmetic (sign fill)
85- none none __lshrsi3 // a >> b logical (zero fill) missing (e.g. used by rl78)
86- port llvm __lshrdi3 // a >> b logical (zero fill)
87- port llvm __lshrti3 // a >> b logical (zero fill)
88- port llvm __negdi2 // -a symbol-level compatibility: libgcc
89- port llvm __negti2 // -a unnecessary: unused in backends
90- port llvm __mulsi3 // a * b signed
91- port llvm __muldi3 // a * b signed
92- port llvm __multi3 // a * b signed
93- port llvm __divsi3 // a / b signed
94- port llvm __divdi3 // a / b signed
95- port llvm __divti3 // a / b signed
96- port llvm __udivsi3 // a / b unsigned
97- port llvm __udivdi3 // a / b unsigned
98- port llvm __udivti3 // a / b unsigned
99- port llvm __modsi3 // a % b signed
100- port llvm __moddi3 // a % b signed
101- port llvm __modti3 // a % b signed
102- port llvm __umodsi3 // a % b unsigned
103- port llvm __umoddi3 // a % b unsigned
104- port llvm __umodti3 // a % b unsigned
105- port llvm __udivmoddi4 // a / b, rem.* = a % b unsigned
106- port llvm __udivmodti4 // a / b, rem.* = a % b unsigned
107- port llvm __udivmodsi4 // a / b, rem.* = a % b unsigned
108- port llvm __divmodsi4 // a / b, rem.* = a % b signed, ARM
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 //
109113
110114#### Integer Arithmetic with trapping overflow
115
111116- dev BitTwiddlingHacks __absvsi2 // abs(a)
112117- dev BitTwiddlingHacks __absvdi2 // abs(a)
113118- dev BitTwiddlingHacks __absvti2 // abs(a)
......@@ -116,152 +121,388 @@ Bugs should be solved by trying to duplicate the bug upstream, if possible.
116121- port llvm __negvti2 // -a
117122- TODO upstreaming __addvsi3..__mulvti3 after testing panics works
118123- dev HackersDelight __addvsi3 // a + b
119- dev HackersDelight __addvdi3 // a + b
120- dev HackersDelight __addvti3 // a + b
124- dev HackersDelight __addvdi3 //
125- dev HackersDelight __addvti3 //
121126- dev HackersDelight __subvsi3 // a - b
122- dev HackersDelight __subvdi3 // a - b
123- dev HackersDelight __subvti3 // a - b
127- dev HackersDelight __subvdi3 //
128- dev HackersDelight __subvti3 //
124129- dev HackersDelight __mulvsi3 // a * b
125- dev HackersDelight __mulvdi3 // a * b
126- dev HackersDelight __mulvti3 // a * b
130- dev HackersDelight __mulvdi3 //
131- dev HackersDelight __mulvti3 //
127132
128133#### Integer Arithmetic which returns if overflow (would be faster without pointer)
129- dev HackersDelight __addosi4 // a + b, overflow=>ov.*=1 else 0
134
135- dev HackersDelight __addosi4 // a + b, overflow->ov.*=1 else 0
130136- dev HackersDelight __addodi4 // (completeness + performance, llvm does not use them)
131137- dev HackersDelight __addoti4 //
132- dev HackersDelight __subosi4 // a - b, overflow=>ov.*=1 else 0
138- dev HackersDelight __subosi4 // a - b, overflow->ov.*=1 else 0
133139- dev HackersDelight __subodi4 // (completeness + performance, llvm does not use them)
134140- dev HackersDelight __suboti4 //
135- dev HackersDelight __mulosi4 // a * b, overflow=>ov.*=1 else 0
141- dev HackersDelight __mulosi4 // a * b, overflow->ov.*=1 else 0
136142- dev HackersDelight __mulodi4 // (required by llvm)
137143- dev HackersDelight __muloti4 //
138144
139145## Float library routines
140146
147TODO: review source of implementation
148
141149#### Float Conversion
142- todo todo __extendsfdf2 // extend a f32 => f64
143- todo todo __extendsftf2 // extend a f32 => f128
144- dev llvm __extendsfxf2 // extend a f32 => f80
145- todo todo __extenddftf2 // extend a f64 => f128
146- dev llvm __extenddfxf2 // extend a f64 => f80
147- todo todo __truncdfsf2 // truncate a to narrower mode of return type, rounding towards zero
148- todo todo __trunctfdf2 //
149- todo todo __trunctfsf2 //
150- dev llvm __truncxfsf2 //
151- dev llvm __truncxfdf2 //
152- todo todo __fixsfsi // convert a to i32, rounding towards zero
153- todo todo __fixdfsi //
154- todo todo __fixtfsi //
155- todo todo __fixxfsi //
156- todo todo __fixsfdi // convert a to i64, rounding towards zero
157- todo todo __fixdfdi //
158- todo todo __fixtfdi //
159- todo todo __fixxfdi //
160- todo todo __fixsfti // convert a to i128, rounding towards zero
161- todo todo __fixdfti //
162- todo todo __fixtfdi //
163- todo todo __fixxfti //
164
165- __fixunssfsi // convert to u32, rounding towards zero. negative values become 0.
166- __fixunsdfsi //
167- __fixunstfsi //
168- __fixunsxfsi //
169- __fixunssfdi // convert to u64, rounding towards zero. negative values become 0.
170- __fixunsdfdi //
171- __fixunstfdi //
172- __fixunsxfdi //
173- __fixunssfti // convert to u128, rounding towards zero. negative values become 0.
174- __fixunsdfti //
175- __fixunstfdi //
176- __fixunsxfti //
177
178- __floatsisf // convert i32 to floating point
179- __floatsidf //
180- __floatsitf //
181- __floatsixf //
182- __floatdisf // convert i64 to floating point
183- __floatdidf //
184- __floatditf //
185- __floatdixf //
186- __floattisf // convert i128 to floating point
187- __floattidf //
188- __floattixf //
189
190- __floatunsisf // convert u32 to floating point
191- __floatunsidf //
192- __floatunsitf //
193- __floatunsixf //
194- __floatundisf // convert u64 to floating point
195- __floatundidf //
196- __floatunditf //
197- __floatundixf //
198- __floatuntisf // convert u128 to floating point
199- __floatuntidf //
200- __floatuntitf //
201- __floatuntixf //
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
202213
203214#### Float Comparison
204- __cmpsf2 // return (a<b)=>-1,(a==b)=>0,(a>b)=>1,Nan=>1 dont rely on this
205- __cmpdf2 // exported from __lesf2, __ledf2, __letf2 (below)
206- __cmptf2 //
207- __unordsf2 // (input==NaN) => out!=0 else out=0,
208- __unorddf2 // __only reliable for (input!=Nan)__
209- __unordtf2 //
210- __eqsf2 // (a!=NaN) and (b!=Nan) and (a==b) => output=0
211- __eqdf2 //
212- __eqtf2 //
213- __nesf2 // (a==NaN) or (b==Nan) or (a!=b) => output!=0
214- __nedf2 //
215- __netf2 //
216- __gesf2 // (a!=Nan) and (b!=Nan) and (a>=b) => output>=0
217- __gedf2 //
218- __getf2 //
219- __ltsf2 // (a!=Nan) and (b!=Nan) and (a<b) => output<0
220- __ltdf2 //
221- __lttf2 //
222- __lesf2 // (a!=Nan) and (b!=Nan) and (a<=b) => output<=0
223- __ledf2 //
224- __letf2 //
225- __gtsf2 // (a!=Nan) and (b!=Nan) and (a>b) => output>0
226- __gtdf2 //
227- __gttf2 //
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
228240
229241#### Float Arithmetic
230- __addsf3 // a + b f32
231- __adddf3 // a + b f64
232- __addtf3 // a + b f128
233- __addxf3 // a + b f80
234- __aeabi_fadd // a + b f64 ARM: AAPCS
235- __aeabi_dadd // a + b f64 ARM: AAPCS
236- __subsf3 // a - b
237- __subdf3 // a - b
238- __subtf3 // a - b
239- __subxf3 // a - b f80
240- __aeabi_fsub // a - b f64 ARM: AAPCS
241- __aeabi_dsub // a - b f64 ARM: AAPCS
242- __mulsf3 // a * b
243- __muldf3 // a * b
244- __multf3 // a * b
245- __mulxf3 // a * b
246- __divsf3 // a / b
247- __divdf3 // a / b
248- __divtf3 // a / b
249- __divxf3 // a / b
250- __negsf2 // -a symbol-level compatibility: libgcc uses this for the rl78
251- __negdf2 // -a unnecessary: can be lowered directly to a xor
252- __negtf2 // -a
253- __negxf2 // -a
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
254267
255268#### Floating point raised to integer power
256- __powisf2 // unclear, if supported a ^ b
257- __powidf2 //
258- __powitf2 //
259- __powixf2 //
260- __mulsc3 // unsupported (a+ib) * (c+id)
261- __muldc3 //
262- __multc3 //
263- __mulxc3 //
264- __divsc3 // unsupported (a+ib) * / (c+id)
265- __divdc3 //
266- __divtc3 //
267- __divxc3 //
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
283
284BID means Binary Integer Decimal encoding, DPD means Densely Packed Decimal encoding.
285BID 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"