2015-08-06 5 views
1

EDIT :: Я сообщил bug GCC bugzilla. Теперь он исправлен.128 бит MVBITS в gfortran

Следующий пример не компилируется с gfortran 4.8.4:

PROGRAM test 
    USE ISO_C_BINDING 
    INTEGER(C_INT128_T) :: CINT128T 
    INTEGER, PARAMETER :: I16B = KIND(CINT128T) 
    INTEGER(I16B) :: a, b 
    a = 127 
    b = 0 
    b = IBSET(b,0) 
    a = IBCLR(a,0) 
    CALL MVBITS(a,0,3,b,0) 
END PROGRAM test 

Вот что я получаю:

$ gfortran test.f90 
/tmp/cc2CEkwu.o: In function `MAIN__': 
test.f90:(.text+0x89): undefined reference to `_gfortran_mvbits_i16' 
collect2: error: ld returned 1 exit status 

Вот как компилируется gfortran (то есть, это версия, которая поставляется с Ubuntu 14.04):

$ gfortran -v 
Using built-in specs. 
COLLECT_GCC=gfortran 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 

Я выполнял другие операции с битами по 128-битным целым числам (IBSET, IBCL R, BTEST, IBITS), и все они работают нормально. Есть идеи?

+0

Much cleaner was use, intrinsic :: iso_c_binding, только: I16B => c_int128_t' (при условии, что компилятор имеет это значение). – francescalus

+0

Или просто 'I16B = C_INT128_T'. Но это не изменит основной вопрос. –

ответ

1

В библиотеке времени выполнения нет 16-байтовой версии этого встроенного. Вам не повезло, получить другой компилятор, который может это сделать (я не знаю) или использовать меньшие целые числа.

Вы также можете написать функцию самостоятельно на C, если вам нравится делать такую ​​вещь.

+0

Возможно, вы знаете какие-либо библиотеки FORTRAN, которые позволяют управлять бит длинными целыми числами? – delete000

+0

@ delete000 Я вижу, что вы сообщили об ошибке в GCC bugzilla. Помимо этого, у меня нет другого прямого предложения. –

+0

Вы можете использовать исправление, предлагаемое там, чтобы исправить ваш компилятор или извлечь из него функцию и связать ее с вашим кодом самостоятельно, если вы знаете C. Обратите внимание на ответ там. «Не знаю, работает ли оно actaully в качестве тестовой программы не имеет выхода и нет индикации ожидаемого результата ». –