From b46ffbe623c974d39f2e59bf368e99aa212fea9a Mon Sep 17 00:00:00 2001 From: Kogia-sima Date: Wed, 8 Jul 2020 05:55:03 +0900 Subject: [PATCH] Optimize write_u128 for small integers --- sailfish/src/runtime/integer.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/sailfish/src/runtime/integer.rs b/sailfish/src/runtime/integer.rs index ec31020..1c69518 100644 --- a/sailfish/src/runtime/integer.rs +++ b/sailfish/src/runtime/integer.rs @@ -189,10 +189,10 @@ unsafe fn write_u64(mut n: u64, buf: *mut u8) -> usize { } } -unsafe fn write_u128(n: u128, buf: *mut u8) -> usize { - if n <= std::u64::MAX as u128 { - write_u64(n as u64, buf) - } else if n < 100_000_000_000_000_000_000_000_000_000_000 { +unsafe fn write_u128_big(n: u128, buf: *mut u8) -> usize { + debug_assert!(n > std::u64::MAX as u128); + + if n < 100_000_000_000_000_000_000_000_000_000_000 { let a0 = (n / 10_000_000_000_000_000) as u64; let a1 = (n % 10_000_000_000_000_000) as u64; @@ -254,6 +254,15 @@ unsafe fn write_u128(n: u128, buf: *mut u8) -> usize { } } +#[inline] +unsafe fn write_u128(n: u128, buf: *mut u8) -> usize { + if n <= std::u64::MAX as u128 { + write_u64(n as u64, buf) + } else { + write_u128_big(n, buf) + } +} + pub trait Integer { const MAX_LEN: usize; unsafe fn write_to(self, buf: *mut u8) -> usize;