authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-07 18:11:10-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-08-07 18:11:24-04:00
logf78ee534843845228910b9bfa52e810767d52fbf
treef9cd718a4a180f300d90c01fb5618fb5c1587cdf
parent2234788fa80dfaf1e58df51ff576701f8161b0df

fix printing floating point compile errors

now we just need compiler_rt implementations for: undefined symbol '__fixunsdfti' undefined symbol '__umodti3' undefined symbol '__udivti3'

1 files changed, 27 insertions(+), 26 deletions(-)

std/fmt/errol/index.zig+27-26
...@@ -181,7 +181,7 @@ fn split(val: f64, hi: &f64, lo: &f64) {...@@ -181,7 +181,7 @@ fn split(val: f64, hi: &f64, lo: &f64) {
181 *lo = val - *hi;181 *lo = val - *hi;
182}182}
183183
184fn gethi(in: f64) {184fn gethi(in: f64) -> f64 {
185 const bits = @bitCast(u64, in);185 const bits = @bitCast(u64, in);
186 const new_bits = bits & 0xFFFFFFFFF8000000;186 const new_bits = bits & 0xFFFFFFFFF8000000;
187 return @bitCast(f64, new_bits);187 return @bitCast(f64, new_bits);
...@@ -199,7 +199,7 @@ fn hpNormalize(hp: &HP) {...@@ -199,7 +199,7 @@ fn hpNormalize(hp: &HP) {
199/// Divide the high-precision number by ten.199/// Divide the high-precision number by ten.
200/// @hp: The high-precision number200/// @hp: The high-precision number
201fn hpDiv10(hp: &HP) {201fn hpDiv10(hp: &HP) {
202 const val = hp.val;202 var val = hp.val;
203203
204 hp.val /= 10.0;204 hp.val /= 10.0;
205 hp.off /= 10.0;205 hp.off /= 10.0;
...@@ -235,7 +235,7 @@ fn hpMul10(hp: &HP) {...@@ -235,7 +235,7 @@ fn hpMul10(hp: &HP) {
235/// @buf: The output buffer.235/// @buf: The output buffer.
236/// &return: The exponent.236/// &return: The exponent.
237fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {237fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {
238 const pow19 = 1e19;238 const pow19 = u128(1e19);
239239
240 assert((val >= 9.007199254740992e15) and val < (3.40282366920938e38));240 assert((val >= 9.007199254740992e15) and val < (3.40282366920938e38));
241241
...@@ -249,10 +249,10 @@ fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {...@@ -249,10 +249,10 @@ fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {
249 low -= 1;249 low -= 1;
250 }250 }
251251
252 const l64 = u64(low % pow19);252 var l64 = u64(low % pow19);
253 const lf = u64((low / pow19) % pow19);253 const lf = u64((low / pow19) % pow19);
254254
255 const h64 = u64(high % pow19);255 var h64 = u64(high % pow19);
256 const hf = u64((high / pow19) % pow19);256 const hf = u64((high / pow19) % pow19);
257257
258 if (lf != hf) {258 if (lf != hf) {
...@@ -269,7 +269,7 @@ fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {...@@ -269,7 +269,7 @@ fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {
269 x *= 10;269 x *= 10;
270 }270 }
271 }271 }
272 const m64: u64 = mid / x;272 const m64 = @truncate(u64, @divTrunc(mid, x));
273273
274 if (lf != hf)274 if (lf != hf)
275 mi += 19;275 mi += 19;
...@@ -277,14 +277,14 @@ fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {...@@ -277,14 +277,14 @@ fn errolInt(val: f64, buffer: []u8) -> FloatDecimal {
277 var buf_index = u64toa(m64, buffer) - 1;277 var buf_index = u64toa(m64, buffer) - 1;
278278
279 if (mi != 0) {279 if (mi != 0) {
280 buffer[buf_index - 1] += (buffer[buf_index] >= '5');280 buffer[buf_index - 1] += u8(buffer[buf_index] >= '5');
281 } else {281 } else {
282 buf_index += 1;282 buf_index += 1;
283 }283 }
284284
285 return FloatDecimal {285 return FloatDecimal {
286 .digits = buffer[0..buf_index],286 .digits = buffer[0..buf_index],
287 .exp = buf_index + mi,287 .exp = i32(buf_index) + mi,
288 };288 };
289}289}
290290
...@@ -303,25 +303,25 @@ fn errolFixed(val: f64, buffer: []u8) -> FloatDecimal {...@@ -303,25 +303,25 @@ fn errolFixed(val: f64, buffer: []u8) -> FloatDecimal {
303 var hi = ((fpnext(val) - n) + mid) / 2.0;303 var hi = ((fpnext(val) - n) + mid) / 2.0;
304304
305 var buf_index = u64toa(u, buffer);305 var buf_index = u64toa(u, buffer);
306 var exp: i32 = buf_index;306 var exp = i32(buf_index);
307 var j: i32 = exp;307 var j = buf_index;
308 buffer[j] = 0;308 buffer[j] = 0;
309309
310 if (mid != 0.0) {310 if (mid != 0.0) {
311 while (mid != 0.0) {311 while (mid != 0.0) {
312 lo *= 10.0;312 lo *= 10.0;
313 var ldig = i32(lo);313 const ldig = i32(lo);
314 lo -= ldig;314 lo -= f64(ldig);
315315
316 mid *= 10.0;316 mid *= 10.0;
317 var mdig = i32(mid);317 const mdig = i32(mid);
318 mid -= mdig;318 mid -= f64(mdig);
319319
320 hi *= 10.0;320 hi *= 10.0;
321 var hdig = i32(hi);321 const hdig = i32(hi);
322 hi -= hdig;322 hi -= f64(hdig);
323323
324 buffer[j] = mdig + '0';324 buffer[j] = u8(mdig + '0');
325 j += 1;325 j += 1;
326326
327 if(hdig != ldig or j > 50)327 if(hdig != ldig or j > 50)
...@@ -330,7 +330,7 @@ fn errolFixed(val: f64, buffer: []u8) -> FloatDecimal {...@@ -330,7 +330,7 @@ fn errolFixed(val: f64, buffer: []u8) -> FloatDecimal {
330330
331 if (mid > 0.5) {331 if (mid > 0.5) {
332 buffer[j-1] += 1;332 buffer[j-1] += 1;
333 } else if ((mid == 0.5) and (buffer[j-1] & 0x1)) {333 } else if ((mid == 0.5) and (buffer[j-1] & 0x1) != 0) {
334 buffer[j-1] += 1;334 buffer[j-1] += 1;
335 }335 }
336 } else {336 } else {
...@@ -374,7 +374,8 @@ pub const c_digits_lut = []u8 {...@@ -374,7 +374,8 @@ pub const c_digits_lut = []u8 {
374 '9', '8', '9', '9',374 '9', '8', '9', '9',
375};375};
376376
377fn u64toa(value: u64, buffer: []u8) -> usize {377fn u64toa(value_param: u64, buffer: []u8) -> usize {
378 var value = value_param;
378 const kTen8: u64 = 100000000;379 const kTen8: u64 = 100000000;
379 const kTen9: u64 = kTen8 * 10;380 const kTen9: u64 = kTen8 * 10;
380 const kTen10: u64 = kTen8 * 100;381 const kTen10: u64 = kTen8 * 100;
...@@ -443,8 +444,8 @@ fn u64toa(value: u64, buffer: []u8) -> usize {...@@ -443,8 +444,8 @@ fn u64toa(value: u64, buffer: []u8) -> usize {
443 buf_index += 1;444 buf_index += 1;
444 }445 }
445 } else if (value < kTen16) {446 } else if (value < kTen16) {
446 const v0: u32 = (uint32_t)(value / kTen8);447 const v0: u32 = u32(value / kTen8);
447 const v1: u32 = (uint32_t)(value % kTen8);448 const v1: u32 = u32(value % kTen8);
448449
449 const b0: u32 = v0 / 10000;450 const b0: u32 = v0 / 10000;
450 const c0: u32 = v0 % 10000;451 const c0: u32 = v0 % 10000;
...@@ -518,11 +519,11 @@ fn u64toa(value: u64, buffer: []u8) -> usize {...@@ -518,11 +519,11 @@ fn u64toa(value: u64, buffer: []u8) -> usize {
518 buffer[buf_index] = c_digits_lut[d8 + 1];519 buffer[buf_index] = c_digits_lut[d8 + 1];
519 buf_index += 1;520 buf_index += 1;
520 } else {521 } else {
521 const a: u32 = (uint32_t)(value / kTen16); // 1 to 1844522 const a = u32(value / kTen16); // 1 to 1844
522 value %= kTen16;523 value %= kTen16;
523524
524 if (a < 10) {525 if (a < 10) {
525 buffer[buf_index] = (char)('0' + (char)(a));526 buffer[buf_index] = '0' + u8(a);
526 buf_index += 1;527 buf_index += 1;
527 } else if (a < 100) {528 } else if (a < 100) {
528 const i: u32 = a << 1;529 const i: u32 = a << 1;
...@@ -531,7 +532,7 @@ fn u64toa(value: u64, buffer: []u8) -> usize {...@@ -531,7 +532,7 @@ fn u64toa(value: u64, buffer: []u8) -> usize {
531 buffer[buf_index] = c_digits_lut[i + 1];532 buffer[buf_index] = c_digits_lut[i + 1];
532 buf_index += 1;533 buf_index += 1;
533 } else if (a < 1000) {534 } else if (a < 1000) {
534 buffer[buf_index] = (char)('0' + (char)(a / 100));535 buffer[buf_index] = '0' + u8(a / 100);
535 buf_index += 1;536 buf_index += 1;
536537
537 const i: u32 = (a % 100) << 1;538 const i: u32 = (a % 100) << 1;
...@@ -552,8 +553,8 @@ fn u64toa(value: u64, buffer: []u8) -> usize {...@@ -552,8 +553,8 @@ fn u64toa(value: u64, buffer: []u8) -> usize {
552 buf_index += 1;553 buf_index += 1;
553 }554 }
554555
555 const v0: u32 = (uint32_t)(value / kTen8);556 const v0 = u32(value / kTen8);
556 const v1: u32 = (uint32_t)(value % kTen8);557 const v1 = u32(value % kTen8);
557558
558 const b0: u32 = v0 / 10000;559 const b0: u32 = v0 / 10000;
559 const c0: u32 = v0 % 10000;560 const c0: u32 = v0 % 10000;