[sisyphus] Сборка FORTRAN-программ

Sergei Epiphanov serpiph на nikiet.ru
Пн Июн 27 10:00:16 UTC 2011


В сообщении от 27 июня 2011 13:27:46 автор Andrey Liakhovets написал:
> Предположительно, компилятор молча игнорирует некорректный "DO I=400",
> после чего "END DO" он действительно не ожидает :)

Странный игнор, не так ли? Бага в компиляторе? А с '-ffree-form' ругань есть. 
Кстати, я сейчас вывел в ассемблер ('gfortran -S -o test.S -ffixed-form 
test.for') оба варианта:
1)
        PROGRAM test
        INTEGER(4) I
        DO 1 I=400
 1      WRITE(*,*)I
        END PROGRAM
2)
        PROGRAM test
        INTEGER(4) I
        DO I=1,400
        WRITE(*,*)I
        END DO
        END PROGRAM

Разница огромная. Очень интересно взглянуть на diff полученных текстов. Во-
первых, нет обработчика цикла после WRITE (как Вы правльно заметили). Но вот 
эти команды меня поставили в ступор:
movl $0x43c80000, %eax
movl %eax, -356(%ebp)
movl $.LC1, -344(%ebp)

где:
.LC1 - указатель на строку 'test.for'

Для сравнения у второй программы это звучит так:
movl $1, -356(%ebp)
movl -356(%ebp), %eax
cmpl $400, %eax
jg .L1
jmp .L3

где:
.L1 - пропуск цикла
.L3 - точка начала цикла

"Шок - это по-нашему".

-- 
С уважением, Епифанов Сергей


Подробная информация о списке рассылки Sisyphus