mix64 Function

private pure function mix64(x) result(r)

The SplitMix64 finalising mix (the “MurmurHash3-style” avalanche used by splitmix64.c). Used both as the generator output stage and as the seed derivation function for stream_for.

Arguments

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

Return Value integer(kind=int64)


Calls

proc~~mix64~~CallsGraph proc~mix64 mix64 proc~u64_mul u64_mul proc~mix64->proc~u64_mul proc~u64_shr u64_shr proc~mix64->proc~u64_shr

Called by

proc~~mix64~~CalledByGraph proc~mix64 mix64 proc~splitmix64_next splitmix64_t%splitmix64_next proc~splitmix64_next->proc~mix64 proc~stream_seed stream_seed proc~stream_seed->proc~mix64 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~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 splitmix64_uniform_below proc~splitmix64_uniform_below->proc~splitmix64_next_u64 interface~next_below next_below interface~next_below->proc~splitmix64_next_below interface~next_exponential_int next_exponential_int interface~next_exponential_int->proc~splitmix64_next_exponential_int interface~next_real_dp next_real_dp interface~next_real_dp->proc~splitmix64_next_real_dp 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~splitmix64_next_range splitmix64_next_range proc~splitmix64_next_range->proc~splitmix64_uniform_below interface~next_bernoulli_ppm next_bernoulli_ppm interface~next_bernoulli_ppm->proc~splitmix64_next_bernoulli_ppm interface~next_poisson_int next_poisson_int interface~next_poisson_int->proc~splitmix64_next_poisson_int interface~next_range next_range interface~next_range->proc~splitmix64_next_range 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~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

Source Code

   pure function mix64(x) result(r)
      !! The SplitMix64 finalising mix (the "MurmurHash3-style" avalanche used
      !! by `splitmix64.c`). Used both as the generator output stage and as the
      !! seed derivation function for `stream_for`.
      integer(int64), intent(in) :: x
      integer(int64) :: r

      r = u64_mul(ieor(x, u64_shr(x, 30_default_int)), MIX_C1)
      r = u64_mul(ieor(r, u64_shr(r, 27_default_int)), MIX_C2)
      r = ieor(r, u64_shr(r, 31_default_int))
   end function mix64