| ... | ... | @@ -15,7 +15,7 @@ Goals: |
| 15 | 15 | |
| 16 | 16 | Current status (tracking libgcc documentation): |
| 17 | 17 | - Integer library routines => almost implemented |
| 18 | | - Soft float library routines => only f80 routines missing |
| 18 | - Soft float library routines => finished |
| 19 | 19 | - Decimal float library routines => unimplemented (~120 functions) |
| 20 | 20 | - Fixed-point fractional library routines => unimplemented (~300 functions) |
| 21 | 21 | - 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. |
| 48 | 48 | ## Integer library routines |
| 49 | 49 | |
| 50 | 50 | #### 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 |
| 69 | 70 | |
| 70 | 71 | #### 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 |
| 77 | 79 | |
| 78 | 80 | #### 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 // |
| 109 | 113 | |
| 110 | 114 | #### Integer Arithmetic with trapping overflow |
| 115 | |
| 111 | 116 | - dev BitTwiddlingHacks __absvsi2 // abs(a) |
| 112 | 117 | - dev BitTwiddlingHacks __absvdi2 // abs(a) |
| 113 | 118 | - dev BitTwiddlingHacks __absvti2 // abs(a) |
| ... | ... | @@ -116,152 +121,388 @@ Bugs should be solved by trying to duplicate the bug upstream, if possible. |
| 116 | 121 | - port llvm __negvti2 // -a |
| 117 | 122 | - TODO upstreaming __addvsi3..__mulvti3 after testing panics works |
| 118 | 123 | - 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 // |
| 121 | 126 | - 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 // |
| 124 | 129 | - 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 // |
| 127 | 132 | |
| 128 | 133 | #### 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 |
| 130 | 136 | - dev HackersDelight __addodi4 // (completeness + performance, llvm does not use them) |
| 131 | 137 | - 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 |
| 133 | 139 | - dev HackersDelight __subodi4 // (completeness + performance, llvm does not use them) |
| 134 | 140 | - 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 |
| 136 | 142 | - dev HackersDelight __mulodi4 // (required by llvm) |
| 137 | 143 | - dev HackersDelight __muloti4 // |
| 138 | 144 | |
| 139 | 145 | ## Float library routines |
| 140 | 146 | |
| 147 | TODO: review source of implementation |
| 148 | |
| 141 | 149 | #### 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 |
| 202 | 213 | |
| 203 | 214 | #### 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 |
| 228 | 240 | |
| 229 | 241 | #### 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 |
| 254 | 267 | |
| 255 | 268 | #### 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 | |
| 284 | BID means Binary Integer Decimal encoding, DPD means Densely Packed Decimal encoding. |
| 285 | BID should be only chosen for binary data, DPD for decimal data (ASCII, Unicode etc). |
| 286 | If possible, use BCD instead of DPD to represent numbers not accurately representable |
| 287 | in binary like the number 0.2. |
| 288 | |
| 289 | All 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 | |
| 344 | Same 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 | |
| 416 | All 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 | |
| 469 | These 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 | |
| 504 | TODO |
| 505 | |
| 506 | Too 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" |