Блоки — различия между версиями
Admin (обсуждение | вклад) (Новая страница: « BLOCK := @IDENT # Block label PHI* # Phi instructions INST* # Regular instructions JUMP # Jump or return Все блоки и…») |
(нет различий)
|
Версия 01:20, 15 марта 2018
BLOCK := @IDENT # Block label PHI* # Phi instructions INST* # Regular instructions JUMP # Jump or return
Все блоки имеют имя, начинающееся с метки "@". Затем следует последовательность инструкций. Наконец один прыжок завершает блок. [[Переходы|Прыжок] может либо передать управление другому блоку той же функции, либо возвратить; они описаны ниже.
All blocks have a name that is specified by a label at their beginning. Then follows a sequence of instructions that have "fall-through" flow. Finally one jump terminates the block. The jump can either transfer control to another block of the same function or return; they are described further below.
Первый блок в функции не должен быть целью любого перехода в программу. Если это действительно необходимо, лучше вставить пустой блок в начале функции.
The first block in a function must not be the target of any jump in the program. If this is really needed, the frontend could insert an empty prelude block at the beginning of the function.
Когда один блок переходит к следующему блоку в файле промежуточного языка, нет необходимости давать команду перехода, он автоматически добавляется парсером. Например, начальный блок (@start) в приведенном ниже примере переходит непосредственно к блоку цикла (@loop).
When one block jumps to the next block in the IL file, it is not necessary to give the jump instruction, it will be automatically added by the parser. For example the start block in the example below jumps directly to the loop block.
Пример. function $loop() { @start @loop %x =w phi @start 100, @loop %x1 %x1 =w sub %x, 1 jnz %x1, @loop, @end @end ret }
Источник: | c9x.me