Инструкции

Материал из Compilers Wiki
Перейти к: навигация, поиск

Инструкции - наименьшая часть кода в промежуточном языке, они формируют тело блоков. Промежуточный язык использует трех-адресный код, что означает, что одна инструкция вычисляет операцию между двумя операндами и присваивает результат третьему.

Instructions are the smallest piece of code in the IL, they form the body of Blocks. The IL uses a three-address code, which means that one instruction computes an operation between two operands and assigns the result to a third one.

Инструкция имеет как имя, так и тип возвращаемого значения, который является базовым типом, определяющим размер результата инструкции. Тип аргументов можно однозначно определить по имени инструкции и типу возвращаемого значения. Например, для всех арифметических инструкций тип аргументов совпадает с типом возвращаемого значения. Два примера инструкций, приведенных ниже корректны, если %y имеет тип w (word) или l (long) (из-за подтипирования).

An instruction has both a name and a return type, this return type is a base type that defines the size of the instruction's result. The type of the arguments can be unambiguously inferred using the instruction name and the return type. For example, for all arithmetic instructions, the type of the arguments is the same as the return type. The two additions below are valid if %y is a word or a long (because of Subtyping).
Пример.
%x =w add 0, %y
%z =w add %x, %x

Некоторые инструкции, например, сравнения и выгрузки из памяти имеют типы операндов, которые отличаются от типов возвращаемых данных. Например, можно сравнить два числа с плавающей точкой и получить результат типа w (word) (0, если сравнение успешно, 1, если оно не выполнено).

Some instructions, like comparisons and memory loads have operand types that differ from their return types. For instance, two floating points can be compared to give a word result (0 if the comparison succeeds, 1 if it fails).
Пример.
%c =w cgts %a, %b

В приведенном примере оба операнда должны иметь тип s (single). Это определено суффиксом инструкции.

In the example above, both operands have to have single type. This is made explicit by the instruction suffix.

Ниже описаны типы инструкций с использованием строки типа s (short). Тип строки определяет все допустимые типы возвращаемых данных, которые может иметь инструкция, ее арность и тип ее аргументов в зависимости от типа возвращаемого значения.

The types of instructions are described below using a short type string. A type string specifies all the valid return types an instruction can have, its arity, and the type of its arguments depending on its return type.

Тип строк начинается с допустимых типов возвращаемых значений, а затем в круглых скобках указываются возможные типы аргументов. Если для инструкции используется N-ый возвращаемый тип типа строки, то аргументы должны использовать N-й тип, указанный для них в строке типа. Когда инструкция не имеет возвращаемого типа, строка типа содержит только типы аргументов.

Type strings begin with acceptable return types, then follows, in parentheses, the possible types for the arguments. If the N-th return type of the type string is used for an instruction, the arguments must use the N-th type listed for them in the type string. When an instruction does not have a return type, the type string only contains the types of the arguments.


Используются следующие сокращения.

  1. T обозначает wlsd
  2. I обозначает wl
  3. F обозначает sd
  4. m обозначает тип указателей на цель; на 64-битных архитектурах это то же самое, что и l (long)

Например, рассмотрим тип строки wl(F), она упоминает, что инструкция имеет только один аргумент и что если используемый тип возвращаемого значения l (long), то аргумент должен иметь тип double.

The following abbreviations are used.

T stands for wlsd
I stands for wl
F stands for sd
m stands for the type of pointers on the target; on 64-bit architectures it is the same as l
For example, consider the type string wl(F), it mentions that the instruction has only one argument and that if the return type used is long, the argument must be of type double.



Источник: c9x.me