Ада-95. Компилятор GNAT

       

Изменяемые инструкции


Иногда, оптимизатор компилятора может перехитрить самого себя.

Например, когда инструкция ассемблера с параметром ввода расположена внутри цикла, он может переместить загрузку параметра ввода за пределы цикла, подразумевая, что это одноразовая инициализация.

Если ваш код не допускает такой трактовки (и вы обнаруживаете этот "сюрприз" достаточно быстро, после анализа генерируемого компилятором ассемблерного файла), то вы можете указать компилятору, чтобы он не пытался перехитрить вас путем установки в True параметра Volatile.

Рассмотрим следующий пример:

Asm ("movl %0, %%ebx" & "movl %%ebx, %1", Inputs => Unsigned_32'Asm_Input ("=g", Input), Outputs => Unsigned_32'Asm_Output ("g", Output), Clobber => "ebx", Volatile => True");

Примечательно, что по умолчанию параметр Volatile

установлен в False пока не существует ни одного параметра вывода.

В результате демонстрации такого примера, может показаться, что установку параметра Volatile в True

стоит использовать повсеместно.

Однако, необходимо заметить, что такая установка будет блокировать оптимизацию кода.

Следовательно, ее использование реально необходимо только в тех случаях, когда без этой установки возникают какие-либо проблемы.



Содержание раздела