4 c * intrinsic bit manipulation functions - Section 13.10.10
5 c * bitcopy subroutine - Section 13.9.3
6 c David Billinghurst <David.Billinghurst@riotinto.com>
9 c * g77 only supports scalar arguments
10 c * third argument of ISHFTC is not optional in g77
14 integer*2 j
, j2
, j3
, ja
15 integer*1 k
, k2
, k3
, ka
16 integer*8 m
, m2
, m3
, ma
21 c BIT_SIZE - Section 13.13.16
22 c Determine BIT_SIZE by counting the bits
26 do while ( (i
.ne
.0) .and
. (ia
.lt
.127) )
30 call c_i
(BIT_SIZE
(i
),ia
,'BIT_SIZE(integer)')
34 do while ( (j
.ne
.0) .and
. (ja
.lt
.127) )
38 call c_i2
(BIT_SIZE
(j
),ja
,'BIT_SIZE(integer*2)')
42 do while ( (k
.ne
.0) .and
. (ka
.lt
.127) )
46 call c_i1
(BIT_SIZE
(k
),ka
,'BIT_SIZE(integer*1)')
50 do while ( (m
.ne
.0) .and
. (ma
.lt
.127) )
54 call c_i8
(BIT_SIZE
(m
),ma
,'BIT_SIZE(integer*8)')
56 c BTEST - Section 13.13.17
63 call c_l
(BTEST
(7,3),.true
.,'BTEST(integer,integer)')
64 call c_l
(BTEST
(7,j2
),.true
.,'BTEST(integer,integer*2)')
65 call c_l
(BTEST
(7,k2
),.true
.,'BTEST(integer,integer*1)')
66 call c_l
(BTEST
(7,m2
),.true
.,'BTEST(integer,integer*8)')
67 call c_l
(BTEST
(j
,3),.true
.,'BTEST(integer*2,integer)')
68 call c_l
(BTEST
(j
,j2
),.true
.,'BTEST(integer*2,integer*2)')
69 call c_l
(BTEST
(j
,k2
),.true
.,'BTEST(integer*2,integer*1)')
70 call c_l
(BTEST
(j
,m2
),.true
.,'BTEST(integer*2,integer*8)')
71 call c_l
(BTEST
(k
,3),.true
.,'BTEST(integer*1,integer)')
72 call c_l
(BTEST
(k
,j2
),.true
.,'BTEST(integer*1,integer*2)')
73 call c_l
(BTEST
(k
,k2
),.true
.,'BTEST(integer*1,integer*1)')
74 call c_l
(BTEST
(k
,m2
),.true
.,'BTEST(integer*1,integer*8)')
75 call c_l
(BTEST
(m
,3),.true
.,'BTEST(integer*8,integer)')
76 call c_l
(BTEST
(m
,j2
),.true
.,'BTEST(integer*8,integer*2)')
77 call c_l
(BTEST
(m
,k2
),.true
.,'BTEST(integer*8,integer*1)')
78 call c_l
(BTEST
(m
,m2
),.true
.,'BTEST(integer*8,integer*8)')
80 c IAND - Section 13.13.40
90 call c_i
(IAND
(3,1),1,'IAND(integer,integer)')
91 call c_i2
(IAND
(j
,j2
),ja
,'IAND(integer*2,integer*2)')
92 call c_i1
(IAND
(k
,k2
),ka
,'IAND(integer*1,integer*1)')
93 call c_i8
(IAND
(m
,m2
),ma
,'IAND(integer*8,integer*8)')
96 c IBCLR - Section 13.13.41
106 call c_i
(IBCLR
(14,1),12,'IBCLR(integer,integer)')
107 call c_i
(IBCLR
(14,j2
),12,'IBCLR(integer,integer*2)')
108 call c_i
(IBCLR
(14,k2
),12,'IBCLR(integer,integer*1)')
109 call c_i
(IBCLR
(14,m2
),12,'IBCLR(integer,integer*8)')
110 call c_i2
(IBCLR
(j
,1),ja
,'IBCLR(integer*2,integer)')
111 call c_i2
(IBCLR
(j
,j2
),ja
,'IBCLR(integer*2,integer*2)')
112 call c_i2
(IBCLR
(j
,k2
),ja
,'IBCLR(integer*2,integer*1)')
113 call c_i2
(IBCLR
(j
,m2
),ja
,'IBCLR(integer*2,integer*8)')
114 call c_i1
(IBCLR
(k
,1),ka
,'IBCLR(integer*1,integer)')
115 call c_i1
(IBCLR
(k
,j2
),ka
,'IBCLR(integer*1,integer*2)')
116 call c_i1
(IBCLR
(k
,k2
),ka
,'IBCLR(integer*1,integer*1)')
117 call c_i1
(IBCLR
(k
,m2
),ka
,'IBCLR(integer*1,integer*8)')
118 call c_i8
(IBCLR
(m
,1),ma
,'IBCLR(integer*8,integer)')
119 call c_i8
(IBCLR
(m
,j2
),ma
,'IBCLR(integer*8,integer*2)')
120 call c_i8
(IBCLR
(m
,k2
),ma
,'IBCLR(integer*8,integer*1)')
121 call c_i8
(IBCLR
(m
,m2
),ma
,'IBCLR(integer*8,integer*8)')
123 c IBSET - Section 13.13.43
133 call c_i
(IBSET
(12,1),14,'IBSET(integer,integer)')
134 call c_i
(IBSET
(12,j2
),14,'IBSET(integer,integer*2)')
135 call c_i
(IBSET
(12,k2
),14,'IBSET(integer,integer*1)')
136 call c_i
(IBSET
(12,m2
),14,'IBSET(integer,integer*8)')
137 call c_i2
(IBSET
(j
,1),ja
,'IBSET(integer*2,integer)')
138 call c_i2
(IBSET
(j
,j2
),ja
,'IBSET(integer*2,integer*2)')
139 call c_i2
(IBSET
(j
,k2
),ja
,'IBSET(integer*2,integer*1)')
140 call c_i2
(IBSET
(j
,m2
),ja
,'IBSET(integer*2,integer*8)')
141 call c_i1
(IBSET
(k
,1),ka
,'IBSET(integer*1,integer)')
142 call c_i1
(IBSET
(k
,j2
),ka
,'IBSET(integer*1,integer*2)')
143 call c_i1
(IBSET
(k
,k2
),ka
,'IBSET(integer*1,integer*1)')
144 call c_i1
(IBSET
(k
,m2
),ka
,'IBSET(integer*1,integer*8)')
145 call c_i8
(IBSET
(m
,1),ma
,'IBSET(integer*8,integer)')
146 call c_i8
(IBSET
(m
,j2
),ma
,'IBSET(integer*8,integer*2)')
147 call c_i8
(IBSET
(m
,k2
),ma
,'IBSET(integer*8,integer*1)')
148 call c_i8
(IBSET
(m
,m2
),ma
,'IBSET(integer*8,integer*8)')
150 c IEOR - Section 13.13.45
160 call c_i
(IEOR
(3,1),2,'IEOR(integer,integer)')
161 call c_i2
(IEOR
(j
,j2
),ja
,'IEOR(integer*2,integer*2)')
162 call c_i1
(IEOR
(k
,k2
),ka
,'IEOR(integer*1,integer*1)')
163 call c_i8
(IEOR
(m
,m2
),ma
,'IEOR(integer*8,integer*8)')
165 c ISHFT - Section 13.13.49
182 call c_i
(ISHFT
(i
,i2
),ia
,'ISHFT(integer,integer)')
183 call c_i
(ISHFT
(i
,BIT_SIZE
(i
)),i3
,'ISHFT(integer,integer) 2')
184 call c_i
(ISHFT
(i
,-BIT_SIZE
(i
)),i3
,'ISHFT(integer,integer) 3')
185 call c_i
(ISHFT
(i
,0),i
,'ISHFT(integer,integer) 4')
186 call c_i2
(ISHFT
(j
,j2
),ja
,'ISHFT(integer*2,integer*2)')
187 call c_i2
(ISHFT
(j
,BIT_SIZE
(j
)),j3
,
188 $
'ISHFT(integer*2,integer*2) 2')
189 call c_i2
(ISHFT
(j
,-BIT_SIZE
(j
)),j3
,
190 $
'ISHFT(integer*2,integer*2) 3')
191 call c_i2
(ISHFT
(j
,0),j
,'ISHFT(integer*2,integer*2) 4')
192 call c_i1
(ISHFT
(k
,k2
),ka
,'ISHFT(integer*1,integer*1)')
193 call c_i1
(ISHFT
(k
,BIT_SIZE
(k
)),k3
,
194 $
'ISHFT(integer*1,integer*1) 2')
195 call c_i1
(ISHFT
(k
,-BIT_SIZE
(k
)),k3
,
196 $
'ISHFT(integer*1,integer*1) 3')
197 call c_i1
(ISHFT
(k
,0),k
,'ISHFT(integer*1,integer*1) 4')
198 call c_i8
(ISHFT
(m
,m2
),ma
,'ISHFT(integer*8,integer*8)')
199 call c_i8
(ISHFT
(m
,BIT_SIZE
(m
)),m3
,
200 $
'ISHFT(integer*8,integer*8) 2')
201 call c_i8
(ISHFT
(m
,-BIT_SIZE
(m
)),m3
,
202 $
'ISHFT(integer*8,integer*8) 3')
203 call c_i8
(ISHFT
(m
,0),m
,'ISHFT(integer*8,integer*8) 4')
205 c ISHFTC - Section 13.13.50
206 c The third argument is not optional in g77
222 c test all the combinations of arguments
223 call c_i
(ISHFTC
(i
,i2
,i3
),5,'ISHFTC(integer,integer,integer)')
224 call c_i
(ISHFTC
(i
,i2
,j3
),5,'ISHFTC(integer,integer,integer*2)')
225 call c_i
(ISHFTC
(i
,i2
,k3
),5,'ISHFTC(integer,integer,integer*1)')
226 call c_i
(ISHFTC
(i
,i2
,m3
),5,'ISHFTC(integer,integer,integer*8)')
227 call c_i
(ISHFTC
(i
,j2
,i3
),5,'ISHFTC(integer,integer*2,integer)')
228 call c_i
(ISHFTC
(i
,j2
,j3
),5,'ISHFTC(integer,integer*2,integer*2)')
229 call c_i
(ISHFTC
(i
,j2
,k3
),5,'ISHFTC(integer,integer*2,integer*1)')
230 call c_i
(ISHFTC
(i
,j2
,m3
),5,'ISHFTC(integer,integer*2,integer*8)')
231 call c_i
(ISHFTC
(i
,k2
,i3
),5,'ISHFTC(integer,integer*1,integer)')
232 call c_i
(ISHFTC
(i
,k2
,j3
),5,'ISHFTC(integer,integer*1,integer*2)')
233 call c_i
(ISHFTC
(i
,k2
,k3
),5,'ISHFTC(integer,integer*1,integer*1)')
234 call c_i
(ISHFTC
(i
,k2
,m3
),5,'ISHFTC(integer,integer*1,integer*8)')
235 call c_i
(ISHFTC
(i
,m2
,i3
),5,'ISHFTC(integer,integer*8,integer)')
236 call c_i
(ISHFTC
(i
,m2
,j3
),5,'ISHFTC(integer,integer*8,integer*2)')
237 call c_i
(ISHFTC
(i
,m2
,k3
),5,'ISHFTC(integer,integer*8,integer*1)')
238 call c_i
(ISHFTC
(i
,m2
,m3
),5,'ISHFTC(integer,integer*8,integer*8)')
240 call c_i2
(ISHFTC
(j
,i2
,i3
),ja
,'ISHFTC(integer*2,integer,integer)')
241 call c_i2
(ISHFTC
(j
,i2
,j3
),ja
,
242 $
'ISHFTC(integer*2,integer,integer*2)')
243 call c_i2
(ISHFTC
(j
,i2
,k3
),ja
,
244 $
'ISHFTC(integer*2,integer,integer*1)')
245 call c_i2
(ISHFTC
(j
,i2
,m3
),ja
,
246 $
'ISHFTC(integer*2,integer,integer*8)')
247 call c_i2
(ISHFTC
(j
,j2
,i3
),ja
,
248 $
'ISHFTC(integer*2,integer*2,integer)')
249 call c_i2
(ISHFTC
(j
,j2
,j3
),ja
,
250 $
'ISHFTC(integer*2,integer*2,integer*2)')
251 call c_i2
(ISHFTC
(j
,j2
,k3
),ja
,
252 $
'ISHFTC(integer*2,integer*2,integer*1)')
253 call c_i2
(ISHFTC
(j
,j2
,m3
),ja
,
254 $
'ISHFTC(integer*2,integer*2,integer*8)')
255 call c_i2
(ISHFTC
(j
,k2
,i3
),ja
,
256 $
'ISHFTC(integer*2,integer*1,integer)')
257 call c_i2
(ISHFTC
(j
,k2
,j3
),ja
,
258 $
'ISHFTC(integer*2,integer*1,integer*2)')
259 call c_i2
(ISHFTC
(j
,k2
,k3
),ja
,
260 $
'ISHFTC(integer*2,integer*1,integer*1)')
261 call c_i2
(ISHFTC
(j
,k2
,m3
),ja
,
262 $
'ISHFTC(integer*2,integer*1,integer*8)')
263 call c_i2
(ISHFTC
(j
,m2
,i3
),ja
,
264 $
'ISHFTC(integer*2,integer*8,integer)')
265 call c_i2
(ISHFTC
(j
,m2
,j3
),ja
,
266 $
'ISHFTC(integer*2,integer*8,integer*2)')
267 call c_i2
(ISHFTC
(j
,m2
,k3
),ja
,
268 $
'ISHFTC(integer*2,integer*8,integer*1)')
269 call c_i2
(ISHFTC
(j
,m2
,m3
),ja
,
270 $
'ISHFTC(integer*2,integer*8,integer*8)')
272 call c_i1
(ISHFTC
(k
,i2
,i3
),ka
,'ISHFTC(integer*1,integer,integer)')
273 call c_i1
(ISHFTC
(k
,i2
,j3
),ka
,
274 $
'ISHFTC(integer*1,integer,integer*2)')
275 call c_i1
(ISHFTC
(k
,i2
,k3
),ka
,
276 $
'ISHFTC(integer*1,integer,integer*1)')
277 call c_i1
(ISHFTC
(k
,i2
,m3
),ka
,
278 $
'ISHFTC(integer*1,integer,integer*8)')
279 call c_i1
(ISHFTC
(k
,j2
,i3
),ka
,
280 $
'ISHFTC(integer*1,integer*2,integer)')
281 call c_i1
(ISHFTC
(k
,j2
,j3
),ka
,
282 $
'ISHFTC(integer*1,integer*2,integer*2)')
283 call c_i1
(ISHFTC
(k
,j2
,k3
),ka
,
284 $
'ISHFTC(integer*1,integer*2,integer*1)')
285 call c_i1
(ISHFTC
(k
,j2
,m3
),ka
,
286 $
'ISHFTC(integer*1,integer*2,integer*8)')
287 call c_i1
(ISHFTC
(k
,k2
,i3
),ka
,
288 $
'ISHFTC(integer*1,integer*1,integer)')
289 call c_i1
(ISHFTC
(k
,k2
,j3
),ka
,
290 $
'ISHFTC(integer*1,integer*1,integer*2)')
291 call c_i1
(ISHFTC
(k
,k2
,k3
),ka
,
292 $
'ISHFTC(integer*1,integer*1,integer*1)')
293 call c_i1
(ISHFTC
(k
,k2
,m3
),ka
,
294 $
'ISHFTC(integer*1,integer*1,integer*8)')
295 call c_i1
(ISHFTC
(k
,m2
,i3
),ka
,
296 $
'ISHFTC(integer*1,integer*8,integer)')
297 call c_i1
(ISHFTC
(k
,m2
,j3
),ka
,
298 $
'ISHFTC(integer*1,integer*8,integer*2)')
299 call c_i1
(ISHFTC
(k
,m2
,k3
),ka
,
300 $
'ISHFTC(integer*1,integer*8,integer*1)')
301 call c_i1
(ISHFTC
(k
,m2
,m3
),ka
,
302 $
'ISHFTC(integer*1,integer*8,integer*8)')
304 call c_i8
(ISHFTC
(m
,i2
,i3
),ma
,'ISHFTC(integer*8,integer,integer)')
305 call c_i8
(ISHFTC
(m
,i2
,j3
),ma
,
306 $
'ISHFTC(integer*8,integer,integer*2)')
307 call c_i8
(ISHFTC
(m
,i2
,k3
),ma
,
308 $
'ISHFTC(integer*8,integer,integer*1)')
309 call c_i8
(ISHFTC
(m
,i2
,m3
),ma
,
310 $
'ISHFTC(integer*8,integer,integer*8)')
311 call c_i8
(ISHFTC
(m
,j2
,i3
),ma
,
312 $
'ISHFTC(integer*8,integer*2,integer)')
313 call c_i8
(ISHFTC
(m
,j2
,j3
),ma
,
314 $
'ISHFTC(integer*8,integer*2,integer*2)')
315 call c_i8
(ISHFTC
(m
,j2
,k3
),ma
,
316 $
'ISHFTC(integer*8,integer*2,integer*1)')
317 call c_i8
(ISHFTC
(m
,j2
,m3
),ma
,
318 $
'ISHFTC(integer*8,integer*2,integer*8)')
319 call c_i8
(ISHFTC
(m
,k2
,i3
),ma
,
320 $
'ISHFTC(integer*8,integer*1,integer)')
321 call c_i8
(ISHFTC
(m
,k2
,j3
),ma
,
322 $
'ISHFTC(integer*1,integer*8,integer*2)')
323 call c_i8
(ISHFTC
(m
,k2
,k3
),ma
,
324 $
'ISHFTC(integer*1,integer*8,integer*1)')
325 call c_i8
(ISHFTC
(m
,k2
,m3
),ma
,
326 $
'ISHFTC(integer*1,integer*8,integer*8)')
327 call c_i8
(ISHFTC
(m
,m2
,i3
),ma
,
328 $
'ISHFTC(integer*8,integer*8,integer)')
329 call c_i8
(ISHFTC
(m
,m2
,j3
),ma
,
330 $
'ISHFTC(integer*8,integer*8,integer*2)')
331 call c_i8
(ISHFTC
(m
,m2
,k3
),ma
,
332 $
'ISHFTC(integer*8,integer*8,integer*1)')
333 call c_i8
(ISHFTC
(m
,m2
,m3
),ma
,
334 $
'ISHFTC(integer*8,integer*8,integer*8)')
336 c test the corner cases
337 call c_i
(ISHFTC
(i
,BIT_SIZE
(i
),BIT_SIZE
(i
)),i
,
338 $
'ISHFTC(i,BIT_SIZE(i),BIT_SIZE(i)) i = integer')
339 call c_i
(ISHFTC
(i
,0,BIT_SIZE
(i
)),i
,
340 $
'ISHFTC(i,0,BIT_SIZE(i)) i = integer')
341 call c_i
(ISHFTC
(i
,-BIT_SIZE
(i
),BIT_SIZE
(i
)),i
,
342 $
'ISHFTC(i,-BIT_SIZE(i),BIT_SIZE(i)) i = integer')
343 call c_i2
(ISHFTC
(j
,BIT_SIZE
(j
),BIT_SIZE
(j
)),j
,
344 $
'ISHFTC(j,BIT_SIZE(j),BIT_SIZE(j)) j = integer*2')
345 call c_i2
(ISHFTC
(j
,0,BIT_SIZE
(j
)),j
,
346 $
'ISHFTC(j,0,BIT_SIZE(j)) j = integer*2')
347 call c_i2
(ISHFTC
(j
,-BIT_SIZE
(j
),BIT_SIZE
(j
)),j
,
348 $
'ISHFTC(j,-BIT_SIZE(j),BIT_SIZE(j)) j = integer*2')
349 call c_i1
(ISHFTC
(k
,BIT_SIZE
(k
),BIT_SIZE
(k
)),k
,
350 $
'ISHFTC(k,BIT_SIZE(k),BIT_SIZE(k)) k = integer*1')
351 call c_i1
(ISHFTC
(k
,0,BIT_SIZE
(k
)),k
,
352 $
'ISHFTC(k,0,BIT_SIZE(k)) k = integer*1')
353 call c_i1
(ISHFTC
(k
,-BIT_SIZE
(k
),BIT_SIZE
(k
)),k
,
354 $
'ISHFTC(k,-BIT_SIZE(k),BIT_SIZE(k)) k = integer*1')
355 call c_i8
(ISHFTC
(m
,BIT_SIZE
(m
),BIT_SIZE
(m
)),m
,
356 $
'ISHFTC(m,BIT_SIZE(m),BIT_SIZE(m)) m = integer*8')
357 call c_i8
(ISHFTC
(m
,0,BIT_SIZE
(m
)),m
,
358 $
'ISHFTC(m,0,BIT_SIZE(m)) m = integer*8')
359 call c_i8
(ISHFTC
(m
,-BIT_SIZE
(m
),BIT_SIZE
(m
)),m
,
360 $
'ISHFTC(m,-BIT_SIZE(m),BIT_SIZE(m)) m = integer*8')
362 c MVBITS - Section 13.13.74
364 call MVBITS
(7,2,2,i
,0)
365 call c_i
(i
,5,'MVBITS 1')
369 call MVBITS
(j2
,2,2,j
,0)
370 call c_i2
(j
,ja
,'MVBITS 2')
374 call MVBITS
(k2
,2,2,k
,0)
375 call c_i1
(k
,ka
,'MVBITS 3')
379 call MVBITS
(m2
,2,2,m
,0)
380 call c_i8
(m
,ma
,'MVBITS 4')
382 c NOT - Section 13.13.77
383 c Rather than assume integer sizes, mask off high bits
393 call c_i
(IAND
(NOT
(21),31),10,'NOT(integer)')
394 call c_i2
(IAND
(NOT
(j
),j2
),ja
,'NOT(integer*2)')
395 call c_i1
(IAND
(NOT
(k
),k2
),ka
,'NOT(integer*1)')
396 call c_i8
(IAND
(NOT
(m
),m2
),ma
,'NOT(integer*8)')
398 if ( fail
) call abort
()
401 subroutine failure
(label
)
402 c Report failure and set flag
406 write(6,'(a,a,a)') 'Test ',label
,' FAILED'
410 subroutine c_l
(i
,j
,label
)
411 c Check if LOGICAL i equals j, and fail otherwise
414 if ( i
.eqv
. j
) then
416 write(6,*) 'Got ',i
,' expected ', j
420 subroutine c_i
(i
,j
,label
)
421 c Check if INTEGER i equals j, and fail otherwise
426 write(6,*) 'Got ',i
,' expected ', j
430 subroutine c_i2
(i
,j
,label
)
431 c Check if INTEGER*2 i equals j, and fail otherwise
436 write(6,*) 'Got ',i
,' expected ', j
440 subroutine c_i1
(i
,j
,label
)
441 c Check if INTEGER*1 i equals j, and fail otherwise
446 write(6,*) 'Got ',i
,' expected ', j
450 subroutine c_i8
(i
,j
,label
)
451 c Check if INTEGER*8 i equals j, and fail otherwise
456 write(6,*) 'Got ',i
,' expected ', j