rotate_right32 Function

private pure function rotate_right32(x, rot) result(r)

Rotate the low 32 bits of x right by rot bits, 0 <= rot <= 31. Branch free: when rot is zero the left-shifted term is shifted clean out of the low 32 bits and the mask removes it.

Arguments

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

Return Value integer(kind=int64)


Called by

proc~~rotate_right32~~CalledByGraph proc~rotate_right32 rotate_right32 proc~pcg32_step pcg32_step proc~pcg32_step->proc~rotate_right32 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~pcg32_seed pcg32_t%pcg32_seed proc~pcg32_seed->proc~pcg32_step 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 pcg32_uniform_below proc~pcg32_uniform_below->proc~pcg32_next_u64 interface~next_below next_below interface~next_below->proc~pcg32_next_below interface~next_exponential_int next_exponential_int interface~next_exponential_int->proc~pcg32_next_exponential_int interface~next_real_dp next_real_dp interface~next_real_dp->proc~pcg32_next_real_dp 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~pcg32_next_range pcg32_next_range proc~pcg32_next_range->proc~pcg32_uniform_below interface~next_bernoulli_ppm next_bernoulli_ppm interface~next_bernoulli_ppm->proc~pcg32_next_bernoulli_ppm interface~next_poisson_int next_poisson_int interface~next_poisson_int->proc~pcg32_next_poisson_int interface~next_range next_range interface~next_range->proc~pcg32_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 rotate_right32(x, rot) result(r)
      !! Rotate the low 32 bits of `x` right by `rot` bits, `0 <= rot <= 31`.
      !! Branch free: when `rot` is zero the left-shifted term is shifted clean
      !! out of the low 32 bits and the mask removes it.
      integer(int64), intent(in) :: x
      integer(int64), intent(in) :: rot
      integer(int64) :: r

      r = ior(ibits(x, int(rot, default_int), int(32 - rot, default_int)), &
              iand(ishft(iand(x, MASK32), int(32 - rot, default_int)), MASK32))
   end function rotate_right32