"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора

| add SP,2 (31) ret |
|int dummy(i) inc SI | |
|int i; cmp SI,20000 | |
|{ jl $L20008 "- |
| return (i+1); mov [BP-2],SI |
|} pop SI |
| leave |
| ret |
| |
| -· dummy push BP dummy inc AX "-(13)|
| | mov BP,SP ret "- |
| (28)| mov AX,[BP+4] |
| | inc AX |
| | leave |
| L-· ret |
+-------------------------------+
| Подобно большинству компиляторов Си Microsoft C 5.0 |
| передает параметры функциям путем засылки их в стек. |
| Всякий раз при вызове выполняется заголовок, так как |
| функция должна установить адресацию базирующихся на стеке |
| параметров. Однако компилятор WATCOM C 6.0 удаляет |
| стековый заголовок благодаря передаче в регистрах стольких |
| параметров, сколько возможно. |
L-------------------------------
Большинство компиляторов Си позволяют пользователю указывать, какой
набор команд процессора должен использоваться при генерации кода. Хотя
специализированные инструкции конкретного процессора и могут ускорить
выполнение программы, но их применение может ограничить количество машин, на
которых программа может работать.
В случае, когда скорость является критическим параметром, "замена
вызова функции ее телом" может помочь в удалении заголовков вызова функций.
Некоторые компиляторы предоставляют возможность заменять операторами вызовы
функций из некоторого набора, либо генерировать их вызовы. Набор таких
функций содержит некоторые общеупотребительные функции, такие как abs.
Функции из этого набора называются встроенными. Эта оптимизация полезна для
внутренних циклов, которые выполняются многократно. Набор доступных
встроенных функций зависит от компилятора.
Компилятор, который генерирует прямой код для математического
сопроцессора, ускоряет программу, которая выполняет много операций с
плавающей точкой. Для того, чтобы поддерживать сопроцессор и максимизировать
эффективность плавающей арифметики, оптимизирующий компилятор может
генерировать непосредственно последовательность команд сопроцессора в
противоположность использованию программной эмуляции функций плавающей
арифметики.
При трансляции условных операторов генератор кода компилятора иногда
генерирует инструкции перехода, которые передают управление на другие
инструкции перехода. "Сжатие цепочки переходов" просто превращает связанное
множество переходов в единственный переход от начала цепочки переходов к
конечной цели.