| use crate::digit_table::*; |
| use core::ptr; |
| |
| #[cfg_attr(feature = "no-panic", inline)] |
| pub unsafe fn write_mantissa_long(mut output: u64, mut result: *mut u8) { |
| if (output >> 32) != 0 { |
| // One expensive 64-bit division. |
| let mut output2 = (output - 100_000_000 * (output / 100_000_000)) as u32; |
| output /= 100_000_000; |
| |
| let c = output2 % 10_000; |
| output2 /= 10_000; |
| let d = output2 % 10_000; |
| let c0 = (c % 100) << 1; |
| let c1 = (c / 100) << 1; |
| let d0 = (d % 100) << 1; |
| let d1 = (d / 100) << 1; |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(c0 as isize), |
| result.offset(-2), |
| 2, |
| ); |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(c1 as isize), |
| result.offset(-4), |
| 2, |
| ); |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(d0 as isize), |
| result.offset(-6), |
| 2, |
| ); |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(d1 as isize), |
| result.offset(-8), |
| 2, |
| ); |
| result = result.offset(-8); |
| } |
| write_mantissa(output as u32, result); |
| } |
| |
| #[cfg_attr(feature = "no-panic", inline)] |
| pub unsafe fn write_mantissa(mut output: u32, mut result: *mut u8) { |
| while output >= 10_000 { |
| let c = output - 10_000 * (output / 10_000); |
| output /= 10_000; |
| let c0 = (c % 100) << 1; |
| let c1 = (c / 100) << 1; |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(c0 as isize), |
| result.offset(-2), |
| 2, |
| ); |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(c1 as isize), |
| result.offset(-4), |
| 2, |
| ); |
| result = result.offset(-4); |
| } |
| if output >= 100 { |
| let c = (output % 100) << 1; |
| output /= 100; |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(c as isize), |
| result.offset(-2), |
| 2, |
| ); |
| result = result.offset(-2); |
| } |
| if output >= 10 { |
| let c = output << 1; |
| ptr::copy_nonoverlapping( |
| DIGIT_TABLE.as_ptr().offset(c as isize), |
| result.offset(-2), |
| 2, |
| ); |
| } else { |
| *result.offset(-1) = b'0' + output as u8; |
| } |
| } |