[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