[Bug libfortran/25577] gfortran routine mvbits returns wrong answer.
dir at lanl dot gov
gcc-bugzilla@gcc.gnu.org
Thu Dec 29 15:34:00 GMT 2005
------- Comment #1 from dir at lanl dot gov 2005-12-29 15:34 -------
Here is another test example that more clearly shows the problem (The f90
output is correct) -
[dranta:~/tests/gfortran-D] dir% f90 -o sage03 sage03.f90
[dranta:~/tests/gfortran-D] dir% sage03
1 ffffffffffffffff ffffffffffffffff
2 fffffffffffffffd fffffffffffffffd
3 fffffffffffffff9 fffffffffffffff9
4 fffffffffffffff1 fffffffffffffff1
5 ffffffffffffffe1 ffffffffffffffe1
6 ffffffffffffffc1 ffffffffffffffc1
7 ffffffffffffff81 ffffffffffffff81
8 ffffffffffffff01 ffffffffffffff01
9 fffffffffffffe01 fffffffffffffe01
10 fffffffffffffc01 fffffffffffffc01
11 fffffffffffff801 fffffffffffff801
12 fffffffffffff001 fffffffffffff001
13 ffffffffffffe001 ffffffffffffe001
14 ffffffffffffc001 ffffffffffffc001
15 ffffffffffff8001 ffffffffffff8001
16 ffffffffffff0001 ffffffffffff0001
17 fffffffffffe0001 fffffffffffe0001
18 fffffffffffc0001 fffffffffffc0001
19 fffffffffff80001 fffffffffff80001
20 fffffffffff00001 fffffffffff00001
21 ffffffffffe00001 ffffffffffe00001
22 ffffffffffc00001 ffffffffffc00001
23 ffffffffff800001 ffffffffff800001
24 ffffffffff000001 ffffffffff000001
25 fffffffffe000001 fffffffffe000001
26 fffffffffc000001 fffffffffc000001
27 fffffffff8000001 fffffffff8000001
28 fffffffff0000001 fffffffff0000001
29 ffffffffe0000001 ffffffffe0000001
30 ffffffffc0000001 ffffffffc0000001
31 ffffffff80000001 ffffffff80000001
32 ffffffff00000001 ffffffff00000001
33 fffffffe00000001 fffffffe00000001
34 fffffffc00000001 fffffffc00000001
35 fffffff800000001 fffffff800000001
36 fffffff000000001 fffffff000000001
37 ffffffe000000001 ffffffe000000001
38 ffffffc000000001 ffffffc000000001
39 ffffff8000000001 ffffff8000000001
40 ffffff0000000001 ffffff0000000001
41 fffffe0000000001 fffffe0000000001
42 fffffc0000000001 fffffc0000000001
43 fffff80000000001 fffff80000000001
44 fffff00000000001 fffff00000000001
45 ffffe00000000001 ffffe00000000001
46 ffffc00000000001 ffffc00000000001
47 ffff800000000001 ffff800000000001
48 ffff000000000001 ffff000000000001
49 fffe000000000001 fffe000000000001
50 fffc000000000001 fffc000000000001
51 fff8000000000001 fff8000000000001
52 fff0000000000001 fff0000000000001
53 ffe0000000000001 ffe0000000000001
54 ffc0000000000001 ffc0000000000001
55 ff80000000000001 ff80000000000001
56 ff00000000000001 ff00000000000001
57 fe00000000000001 fe00000000000001
58 fc00000000000001 fc00000000000001
59 f800000000000001 f800000000000001
60 f000000000000001 f000000000000001
61 e000000000000001 e000000000000001
62 c000000000000001 c000000000000001
63 8000000000000001 8000000000000001
64 1 1
[dranta:~/tests/gfortran-D] dir% gfortran -o sage03 sage03.f90
[dranta:~/tests/gfortran-D] dir% sage03
1 FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF
2 FFFFFFFFFFFFFFFD FFFFFFFFFFFFFFFD
3 FFFFFFFFFFFFFFF9 FFFFFFFFFFFFFFF9
4 FFFFFFFFFFFFFFF1 FFFFFFFFFFFFFFF1
5 FFFFFFFFFFFFFFE1 FFFFFFFFFFFFFFE1
6 FFFFFFFFFFFFFFC1 FFFFFFFFFFFFFFC1
7 FFFFFFFFFFFFFF81 FFFFFFFFFFFFFF81
8 FFFFFFFFFFFFFF01 FFFFFFFFFFFFFF01
9 FFFFFFFFFFFFFE01 FFFFFFFFFFFFFE01
10 FFFFFFFFFFFFFC01 FFFFFFFFFFFFFC01
11 FFFFFFFFFFFFF801 FFFFFFFFFFFFF801
12 FFFFFFFFFFFFF001 FFFFFFFFFFFFF001
13 FFFFFFFFFFFFE001 FFFFFFFFFFFFE001
14 FFFFFFFFFFFFC001 FFFFFFFFFFFFC001
15 FFFFFFFFFFFF8001 FFFFFFFFFFFF8001
16 FFFFFFFFFFFF0001 FFFFFFFFFFFF0001
17 FFFFFFFFFFFE0001 FFFFFFFFFFFE0001
18 FFFFFFFFFFFC0001 FFFFFFFFFFFC0001
19 FFFFFFFFFFF80001 FFFFFFFFFFF80001
20 FFFFFFFFFFF00001 FFFFFFFFFFF00001
21 FFFFFFFFFFE00001 FFFFFFFFFFE00001
22 FFFFFFFFFFC00001 FFFFFFFFFFC00001
23 FFFFFFFFFF800001 FFFFFFFFFF800001
24 FFFFFFFFFF000001 FFFFFFFFFF000001
25 FFFFFFFFFE000001 FFFFFFFFFE000001
26 FFFFFFFFFC000001 FFFFFFFFFC000001
27 FFFFFFFFF8000001 FFFFFFFFF8000001
28 FFFFFFFFF0000001 FFFFFFFFF0000001
29 FFFFFFFFE0000001 FFFFFFFFE0000001
30 FFFFFFFFC0000001 FFFFFFFFC0000001
31 FFFFFFFF80000001 FFFFFFFF80000001
32 1 FFFFFFFF00000001
Abort
[dranta:~/tests/gfortran-D] dir% cat sage03.f90
implicit none
integer*8 cray64_int,ieee64_int,ia,itwo
integer ibits,n
itwo=2
ibits=bit_size(cray64_int)
do n=1,ibits
ieee64_int=-1
cray64_int=1
call mvbits(cray64_int, 0,n,ieee64_int, 0)
ia=-1
ia=ia-itwo**n+2
write(6,'(i5,2z20)')n,ieee64_int,ia
if(ia.ne.ieee64_int)call abort
enddo
stop
end
[dranta:~/tests/gfortran-D] dir%
Changing the line in mvbits.c from
lenmask = (*len == sizeof (TYPE)*8) ? ~(TYPE)0 : (1 << *len) - 1;
to
lenmask = (*len == sizeof (TYPE)*8) ? ~(TYPE)0 : ((TYPE)1 << *len) - 1;
fixes the problem on the Macintosh, but the results are still incorrect on
linux
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25577
More information about the Gcc-bugs
mailing list