u64_add Function

public pure function u64_add(a, b) result(r)

(a + b) reduced modulo 264, without ever overflowing a signed 64-bit integer. Operands are split into 32-bit halves with ibits, so each half sum stays below 233.

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: a
integer(kind=int64), intent(in) :: b

Return Value integer(kind=int64)


Called by

proc~~u64_add~~CalledByGraph proc~u64_add u64_add proc~fnv1a_byte64 fnv1a_byte64 proc~fnv1a_byte64->proc~u64_add proc~pcg32_next_range pcg32_next_range proc~pcg32_next_range->proc~u64_add proc~pcg32_uniform_below pcg32_uniform_below proc~pcg32_next_range->proc~pcg32_uniform_below proc~pcg32_seed pcg32_t%pcg32_seed proc~pcg32_seed->proc~u64_add proc~pcg32_step pcg32_step proc~pcg32_seed->proc~pcg32_step proc~pcg32_step->proc~u64_add proc~splitmix64_next splitmix64_t%splitmix64_next proc~splitmix64_next->proc~u64_add proc~splitmix64_next_range splitmix64_next_range proc~splitmix64_next_range->proc~u64_add proc~splitmix64_uniform_below splitmix64_uniform_below proc~splitmix64_next_range->proc~splitmix64_uniform_below proc~stream_seed stream_seed proc~stream_seed->proc~u64_add interface~next_range next_range interface~next_range->proc~pcg32_next_range interface~next_range->proc~splitmix64_next_range proc~feed_integer64 feed_integer64 proc~feed_integer64->proc~fnv1a_byte64 proc~pcg32_next pcg32_t%pcg32_next proc~pcg32_next->proc~pcg32_step proc~pcg32_next_u64 pcg32_t%pcg32_next_u64 proc~pcg32_next_u64->proc~pcg32_step proc~splitmix64_next_u64 splitmix64_t%splitmix64_next_u64 proc~splitmix64_next_u64->proc~splitmix64_next proc~stream_for_pcg32 stream_for_pcg32 proc~stream_for_pcg32->proc~splitmix64_next proc~stream_for_pcg32->proc~stream_seed proc~stream_for_splitmix64 stream_for_splitmix64 proc~stream_for_splitmix64->proc~stream_seed interface~stream_for stream_for interface~stream_for->proc~stream_for_pcg32 interface~stream_for->proc~stream_for_splitmix64 proc~feed_logical64 feed_logical64 proc~feed_logical64->proc~feed_integer64 proc~feed_real_record64 feed_real_record64 proc~feed_real_record64->proc~feed_integer64 proc~pcg32_next_below pcg32_next_below proc~pcg32_next_below->proc~pcg32_next_u64 proc~pcg32_next_exponential_int pcg32_next_exponential_int proc~pcg32_next_exponential_int->proc~pcg32_next_u64 proc~pcg32_next_real_dp pcg32_next_real_dp proc~pcg32_next_real_dp->proc~pcg32_next_u64 proc~pcg32_uniform_below->proc~pcg32_next_u64 proc~splitmix64_next_below splitmix64_next_below proc~splitmix64_next_below->proc~splitmix64_next_u64 proc~splitmix64_next_exponential_int splitmix64_next_exponential_int proc~splitmix64_next_exponential_int->proc~splitmix64_next_u64 proc~splitmix64_next_real_dp splitmix64_next_real_dp proc~splitmix64_next_real_dp->proc~splitmix64_next_u64 proc~splitmix64_uniform_below->proc~splitmix64_next_u64 proc~update64_char_0 array_hash64_t%update64_char_0 proc~update64_char_0->proc~feed_integer64 proc~update64_int16_0 array_hash64_t%update64_int16_0 proc~update64_int16_0->proc~feed_integer64 proc~update64_int16_1 array_hash64_t%update64_int16_1 proc~update64_int16_1->proc~feed_integer64 proc~update64_int32_0 array_hash64_t%update64_int32_0 proc~update64_int32_0->proc~feed_integer64 proc~update64_int32_1 array_hash64_t%update64_int32_1 proc~update64_int32_1->proc~feed_integer64 proc~update64_int64_0 array_hash64_t%update64_int64_0 proc~update64_int64_0->proc~feed_integer64 proc~update64_int64_1 array_hash64_t%update64_int64_1 proc~update64_int64_1->proc~feed_integer64 proc~update64_int8_0 array_hash64_t%update64_int8_0 proc~update64_int8_0->proc~feed_integer64 proc~update64_int8_1 array_hash64_t%update64_int8_1 proc~update64_int8_1->proc~feed_integer64 interface~next_below next_below interface~next_below->proc~pcg32_next_below interface~next_below->proc~splitmix64_next_below interface~next_exponential_int next_exponential_int interface~next_exponential_int->proc~pcg32_next_exponential_int interface~next_exponential_int->proc~splitmix64_next_exponential_int interface~next_real_dp next_real_dp interface~next_real_dp->proc~pcg32_next_real_dp interface~next_real_dp->proc~splitmix64_next_real_dp none~update~2 array_hash64_t%update none~update~2->proc~update64_char_0 none~update~2->proc~update64_int16_0 none~update~2->proc~update64_int16_1 none~update~2->proc~update64_int32_0 none~update~2->proc~update64_int32_1 none~update~2->proc~update64_int64_0 none~update~2->proc~update64_int64_1 none~update~2->proc~update64_int8_0 none~update~2->proc~update64_int8_1 proc~update64_logical_0 array_hash64_t%update64_logical_0 none~update~2->proc~update64_logical_0 proc~update64_logical_1 array_hash64_t%update64_logical_1 none~update~2->proc~update64_logical_1 proc~feed_real_dp64 feed_real_dp64 proc~feed_real_dp64->proc~feed_real_record64 proc~feed_real_sp64 feed_real_sp64 proc~feed_real_sp64->proc~feed_real_record64 proc~pcg32_next_bernoulli_ppm pcg32_next_bernoulli_ppm proc~pcg32_next_bernoulli_ppm->proc~pcg32_uniform_below proc~pcg32_next_poisson_int pcg32_next_poisson_int proc~pcg32_next_poisson_int->proc~pcg32_next_exponential_int proc~splitmix64_next_bernoulli_ppm splitmix64_next_bernoulli_ppm proc~splitmix64_next_bernoulli_ppm->proc~splitmix64_uniform_below proc~splitmix64_next_poisson_int splitmix64_next_poisson_int proc~splitmix64_next_poisson_int->proc~splitmix64_next_exponential_int proc~update64_logical_0->proc~feed_logical64 proc~update64_logical_1->proc~feed_logical64 interface~next_bernoulli_ppm next_bernoulli_ppm interface~next_bernoulli_ppm->proc~pcg32_next_bernoulli_ppm interface~next_bernoulli_ppm->proc~splitmix64_next_bernoulli_ppm interface~next_poisson_int next_poisson_int interface~next_poisson_int->proc~pcg32_next_poisson_int interface~next_poisson_int->proc~splitmix64_next_poisson_int proc~hash64_cdp_1 hash64_cdp_1 proc~hash64_cdp_1->none~update~2 proc~hash64_cdp_2 hash64_cdp_2 proc~hash64_cdp_2->none~update~2 proc~hash64_cdp_3 hash64_cdp_3 proc~hash64_cdp_3->none~update~2 proc~hash64_char_0 hash64_char_0 proc~hash64_char_0->none~update~2 proc~hash64_char_1 hash64_char_1 proc~hash64_char_1->none~update~2 proc~hash64_csp_1 hash64_csp_1 proc~hash64_csp_1->none~update~2 proc~hash64_csp_2 hash64_csp_2 proc~hash64_csp_2->none~update~2 proc~hash64_csp_3 hash64_csp_3 proc~hash64_csp_3->none~update~2 proc~hash64_int16_1 hash64_int16_1 proc~hash64_int16_1->none~update~2 proc~hash64_int16_2 hash64_int16_2 proc~hash64_int16_2->none~update~2 proc~hash64_int16_3 hash64_int16_3 proc~hash64_int16_3->none~update~2 proc~hash64_int32_1 hash64_int32_1 proc~hash64_int32_1->none~update~2 proc~hash64_int32_2 hash64_int32_2 proc~hash64_int32_2->none~update~2 proc~hash64_int32_3 hash64_int32_3 proc~hash64_int32_3->none~update~2 proc~hash64_int64_1 hash64_int64_1 proc~hash64_int64_1->none~update~2 proc~hash64_int64_2 hash64_int64_2 proc~hash64_int64_2->none~update~2 proc~hash64_int64_3 hash64_int64_3 proc~hash64_int64_3->none~update~2 proc~hash64_int8_1 hash64_int8_1 proc~hash64_int8_1->none~update~2 proc~hash64_int8_2 hash64_int8_2 proc~hash64_int8_2->none~update~2 proc~hash64_int8_3 hash64_int8_3 proc~hash64_int8_3->none~update~2 proc~hash64_logical_1 hash64_logical_1 proc~hash64_logical_1->none~update~2 proc~hash64_logical_2 hash64_logical_2 proc~hash64_logical_2->none~update~2 proc~hash64_logical_3 hash64_logical_3 proc~hash64_logical_3->none~update~2 proc~hash64_rdp_1 hash64_rdp_1 proc~hash64_rdp_1->none~update~2 proc~hash64_rdp_2 hash64_rdp_2 proc~hash64_rdp_2->none~update~2 proc~hash64_rdp_3 hash64_rdp_3 proc~hash64_rdp_3->none~update~2 proc~hash64_rsp_1 hash64_rsp_1 proc~hash64_rsp_1->none~update~2 proc~hash64_rsp_2 hash64_rsp_2 proc~hash64_rsp_2->none~update~2 proc~hash64_rsp_3 hash64_rsp_3 proc~hash64_rsp_3->none~update~2 proc~pcg32_next_exponential_dp pcg32_next_exponential_dp proc~pcg32_next_exponential_dp->interface~next_real_dp proc~pcg32_next_normal_dp pcg32_next_normal_dp proc~pcg32_next_normal_dp->interface~next_real_dp proc~soa_hash64_int32_field soa_hash64_int32_field proc~soa_hash64_int32_field->none~update~2 proc~soa_hash64_int64_field soa_hash64_int64_field proc~soa_hash64_int64_field->none~update~2 proc~soa_hash64_logical_field soa_hash64_logical_field proc~soa_hash64_logical_field->none~update~2 proc~soa_hash64_real_dp_field soa_hash64_real_dp_field proc~soa_hash64_real_dp_field->none~update~2 proc~soa_hash64_real_sp_field soa_hash64_real_sp_field proc~soa_hash64_real_sp_field->none~update~2 proc~soa_hash_begin_64 soa_hash_begin_64 proc~soa_hash_begin_64->none~update~2 proc~splitmix64_next_exponential_dp splitmix64_next_exponential_dp proc~splitmix64_next_exponential_dp->interface~next_real_dp proc~splitmix64_next_normal_dp splitmix64_next_normal_dp proc~splitmix64_next_normal_dp->interface~next_real_dp proc~update64_cdp_0 array_hash64_t%update64_cdp_0 proc~update64_cdp_0->proc~feed_real_dp64 proc~update64_cdp_1 array_hash64_t%update64_cdp_1 proc~update64_cdp_1->proc~feed_real_dp64 proc~update64_cdp_2 array_hash64_t%update64_cdp_2 proc~update64_cdp_2->none~update~2 proc~update64_cdp_3 array_hash64_t%update64_cdp_3 proc~update64_cdp_3->none~update~2 proc~update64_char_1 array_hash64_t%update64_char_1 proc~update64_char_1->none~update~2 proc~update64_csp_0 array_hash64_t%update64_csp_0 proc~update64_csp_0->proc~feed_real_sp64 proc~update64_csp_1 array_hash64_t%update64_csp_1 proc~update64_csp_1->proc~feed_real_sp64 proc~update64_csp_2 array_hash64_t%update64_csp_2 proc~update64_csp_2->none~update~2 proc~update64_csp_3 array_hash64_t%update64_csp_3 proc~update64_csp_3->none~update~2 proc~update64_int16_2 array_hash64_t%update64_int16_2 proc~update64_int16_2->none~update~2 proc~update64_int16_3 array_hash64_t%update64_int16_3 proc~update64_int16_3->none~update~2 proc~update64_int32_2 array_hash64_t%update64_int32_2 proc~update64_int32_2->none~update~2 proc~update64_int32_3 array_hash64_t%update64_int32_3 proc~update64_int32_3->none~update~2 proc~update64_int64_2 array_hash64_t%update64_int64_2 proc~update64_int64_2->none~update~2 proc~update64_int64_3 array_hash64_t%update64_int64_3 proc~update64_int64_3->none~update~2 proc~update64_int8_2 array_hash64_t%update64_int8_2 proc~update64_int8_2->none~update~2 proc~update64_int8_3 array_hash64_t%update64_int8_3 proc~update64_int8_3->none~update~2 proc~update64_logical_2 array_hash64_t%update64_logical_2 proc~update64_logical_2->none~update~2 proc~update64_logical_3 array_hash64_t%update64_logical_3 proc~update64_logical_3->none~update~2 proc~update64_rdp_0 array_hash64_t%update64_rdp_0 proc~update64_rdp_0->proc~feed_real_dp64 proc~update64_rdp_1 array_hash64_t%update64_rdp_1 proc~update64_rdp_1->proc~feed_real_dp64 proc~update64_rdp_2 array_hash64_t%update64_rdp_2 proc~update64_rdp_2->none~update~2 proc~update64_rdp_3 array_hash64_t%update64_rdp_3 proc~update64_rdp_3->none~update~2 proc~update64_rsp_0 array_hash64_t%update64_rsp_0 proc~update64_rsp_0->proc~feed_real_sp64 proc~update64_rsp_1 array_hash64_t%update64_rsp_1 proc~update64_rsp_1->proc~feed_real_sp64 proc~update64_rsp_2 array_hash64_t%update64_rsp_2 proc~update64_rsp_2->none~update~2 proc~update64_rsp_3 array_hash64_t%update64_rsp_3 proc~update64_rsp_3->none~update~2

Variables

Type Visibility Attributes Name Initial
integer(kind=int64), private :: high
integer(kind=int64), private :: low

Source Code

   pure function u64_add(a, b) result(r)
      !! `(a + b)` reduced modulo 2**64, without ever overflowing a signed
      !! 64-bit integer. Operands are split into 32-bit halves with `ibits`, so
      !! each half sum stays below 2**33.
      integer(int64), intent(in) :: a
      integer(int64), intent(in) :: b
      integer(int64) :: r

      integer(int64) :: low, high

      low = ibits(a, 0, 32) + ibits(b, 0, 32)
      high = ibits(a, 32, 32) + ibits(b, 32, 32) + ibits(low, 32, 32)
      r = ior(ishft(iand(high, MASK32), 32), iand(low, MASK32))
   end function u64_add