Splits an array of int8 values into two int4 arrays.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=int_8), | intent(in), | DIMENSION(:) | :: | merged |
array of merged values |
|
integer(kind=int_4), | intent(out), | DIMENSION(:) | :: | array_upper |
array to fill with the upper bytes of the merged values array to fill with the lower bytes of the merged values |
|
integer(kind=int_4), | intent(out), | DIMENSION(:) | :: | array_lower |
array to fill with the upper bytes of the merged values array to fill with the lower bytes of the merged values |
SUBROUTINE dbcsr_unpack_i8_2i4(merged, array_upper, array_lower) !! Splits an array of int8 values into two int4 arrays. INTEGER(KIND=int_8), DIMENSION(:), INTENT(IN) :: merged !! array of merged values INTEGER(KIND=int_4), DIMENSION(:), INTENT(OUT) :: array_upper, array_lower !! array to fill with the upper bytes of the merged values !! array to fill with the lower bytes of the merged values INTEGER(KIND=int_8), PARAMETER :: lmask8 = 4294967295_int_8 INTEGER :: i ! ! --------------------------------------------------------------------------- ! Lmask is used to filter in the lower 4 bytes and so its lower 32 bits are ! set to 1: lmask8 = 2^32-1. ! Umask is used to filter in the higher 4 bytes and so its higher 32 bits ! are set to 1: umask8 = 2^32-1 << 32 !lmask8 = 4294967295 ! 2^32-1 !umask8 = 18446744069414584320 ! (2^32-1) * 2^32 = (2^64-1)-(2^32-1) DO i = 1, SIZE(merged) array_upper(i) = INT(ISHFT(merged(i), -32), KIND=int_4) array_lower(i) = INT(IAND(merged(i), lmask8), KIND=int_4) END DO END SUBROUTINE dbcsr_unpack_i8_2i4