| 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.get_unchecked(c0 as usize), result.offset(-2), 2); |
| ptr::copy_nonoverlapping(DIGIT_TABLE.get_unchecked(c1 as usize), result.offset(-4), 2); |
| ptr::copy_nonoverlapping(DIGIT_TABLE.get_unchecked(d0 as usize), result.offset(-6), 2); |
| ptr::copy_nonoverlapping(DIGIT_TABLE.get_unchecked(d1 as usize), 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)) as u32; |
| output /= 10_000; |
| let c0 = (c % 100) << 1; |
| let c1 = (c / 100) << 1; |
| ptr::copy_nonoverlapping(DIGIT_TABLE.get_unchecked(c0 as usize), result.offset(-2), 2); |
| ptr::copy_nonoverlapping(DIGIT_TABLE.get_unchecked(c1 as usize), result.offset(-4), 2); |
| result = result.offset(-4); |
| } |
| if output >= 100 { |
| let c = ((output % 100) << 1) as u32; |
| output /= 100; |
| ptr::copy_nonoverlapping(DIGIT_TABLE.get_unchecked(c as usize), result.offset(-2), 2); |
| result = result.offset(-2); |
| } |
| if output >= 10 { |
| let c = (output << 1) as u32; |
| ptr::copy_nonoverlapping(DIGIT_TABLE.get_unchecked(c as usize), result.offset(-2), 2); |
| } else { |
| *result.offset(-1) = b'0' + output as u8; |
| } |
| } |