@@ -126,7 +126,9 @@ subroutine g2_gbytesc8(in, iout, iskip, nbits, nskip, n)
126
126
integer , parameter :: ones(8 ) = (/ 1 , 3 , 7 , 15 , 31 , 63 , 127 , 255 / )
127
127
128
128
integer :: nbit, i, index, ibit, itmp
129
+ integer (kind = 8 ) :: itmp8, itmp8_2, itmp8_3
129
130
integer , external :: mova2i
131
+ integer (kind = 8 ), external :: mova2i8
130
132
131
133
! nbit is the start position of the field in bits
132
134
nbit = iskip
@@ -138,25 +140,30 @@ subroutine g2_gbytesc8(in, iout, iskip, nbits, nskip, n)
138
140
139
141
! first byte
140
142
tbit = min (bitcnt, 8 - ibit)
143
+ itmp8 = iand (mova2i8(in (index)), int (ones(8 - ibit), kind = 8 ))
141
144
itmp = iand (mova2i(in (index)), ones(8 - ibit))
142
145
if (tbit .ne. 8 - ibit) itmp = ishft(itmp, tbit - 8 + ibit)
146
+ if (tbit .ne. 8 - ibit) itmp8 = ishft(itmp8, tbit - 8 + ibit)
143
147
index = index + 1
144
148
bitcnt = bitcnt - tbit
145
149
146
150
! now transfer whole bytes
147
151
do while (bitcnt .ge. 8 )
148
152
itmp = ior (ishft(itmp,8 ), mova2i(in (index)))
153
+ itmp8 = ior (ishft(itmp8,8 ), mova2i8(in (index)))
149
154
bitcnt = bitcnt - 8
150
155
index = index + 1
151
156
enddo
152
157
153
158
! get data from last byte
154
159
if (bitcnt .gt. 0 ) then
155
- itmp = ior (ishft(itmp, bitcnt), iand (ishft(mova2i(in (index)), &
156
- - (8 - bitcnt)), ones(bitcnt)))
160
+ itmp = ior (ishft(itmp, bitcnt), iand (ishft(mova2i(in (index)), - (8 - bitcnt)), ones(bitcnt)))
161
+ itmp8_2 = ishft(mova2i8(in (index)), int (- (8 - bitcnt), kind (8 )))
162
+ itmp8_3 = int (ones(bitcnt), kind (8 ))
163
+ itmp8 = ior (ishft(itmp8, bitcnt), iand (itmp8_2, itmp8_3))
157
164
endif
158
165
159
- iout(i) = itmp
166
+ iout(i) = itmp8
160
167
enddo
161
168
162
169
end subroutine g2_gbytesc8
0 commit comments