| 1 | use crate::digit_table::DIGIT_TABLE; |
| 2 | use core::ptr; |
| 3 | |
| 4 | #[cfg_attr (feature = "no-panic" , inline)] |
| 5 | pub unsafe fn write_mantissa_long(mut output: u64, mut result: *mut u8) { |
| 6 | if (output >> 32) != 0 { |
| 7 | // One expensive 64-bit division. |
| 8 | let mut output2 = (output - 100_000_000 * (output / 100_000_000)) as u32; |
| 9 | output /= 100_000_000; |
| 10 | |
| 11 | let c = output2 % 10_000; |
| 12 | output2 /= 10_000; |
| 13 | let d = output2 % 10_000; |
| 14 | let c0 = (c % 100) << 1; |
| 15 | let c1 = (c / 100) << 1; |
| 16 | let d0 = (d % 100) << 1; |
| 17 | let d1 = (d / 100) << 1; |
| 18 | ptr::copy_nonoverlapping( |
| 19 | DIGIT_TABLE.as_ptr().offset(c0 as isize), |
| 20 | result.offset(-2), |
| 21 | 2, |
| 22 | ); |
| 23 | ptr::copy_nonoverlapping( |
| 24 | DIGIT_TABLE.as_ptr().offset(c1 as isize), |
| 25 | result.offset(-4), |
| 26 | 2, |
| 27 | ); |
| 28 | ptr::copy_nonoverlapping( |
| 29 | DIGIT_TABLE.as_ptr().offset(d0 as isize), |
| 30 | result.offset(-6), |
| 31 | 2, |
| 32 | ); |
| 33 | ptr::copy_nonoverlapping( |
| 34 | DIGIT_TABLE.as_ptr().offset(d1 as isize), |
| 35 | result.offset(-8), |
| 36 | 2, |
| 37 | ); |
| 38 | result = result.offset(-8); |
| 39 | } |
| 40 | write_mantissa(output as u32, result); |
| 41 | } |
| 42 | |
| 43 | #[cfg_attr (feature = "no-panic" , inline)] |
| 44 | pub unsafe fn write_mantissa(mut output: u32, mut result: *mut u8) { |
| 45 | while output >= 10_000 { |
| 46 | let c = output - 10_000 * (output / 10_000); |
| 47 | output /= 10_000; |
| 48 | let c0 = (c % 100) << 1; |
| 49 | let c1 = (c / 100) << 1; |
| 50 | ptr::copy_nonoverlapping( |
| 51 | DIGIT_TABLE.as_ptr().offset(c0 as isize), |
| 52 | result.offset(-2), |
| 53 | 2, |
| 54 | ); |
| 55 | ptr::copy_nonoverlapping( |
| 56 | DIGIT_TABLE.as_ptr().offset(c1 as isize), |
| 57 | result.offset(-4), |
| 58 | 2, |
| 59 | ); |
| 60 | result = result.offset(-4); |
| 61 | } |
| 62 | if output >= 100 { |
| 63 | let c = (output % 100) << 1; |
| 64 | output /= 100; |
| 65 | ptr::copy_nonoverlapping( |
| 66 | DIGIT_TABLE.as_ptr().offset(c as isize), |
| 67 | result.offset(-2), |
| 68 | 2, |
| 69 | ); |
| 70 | result = result.offset(-2); |
| 71 | } |
| 72 | if output >= 10 { |
| 73 | let c = output << 1; |
| 74 | ptr::copy_nonoverlapping( |
| 75 | DIGIT_TABLE.as_ptr().offset(c as isize), |
| 76 | result.offset(-2), |
| 77 | 2, |
| 78 | ); |
| 79 | } else { |
| 80 | *result.offset(-1) = b'0' + output as u8; |
| 81 | } |
| 82 | } |
| 83 | |