Преобразования

Материал из Compilers Wiki
Версия от 18:14, 16 марта 2018; Admin (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

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

Conversion operations allow to change the representation of a value, possibly modifying it if the target type cannot hold the value of the source type. Conversions can extend the precision of a temporary (e.g., from signed 8-bit to 32-bit), or convert a floating point into an integer and vice versa.
extsw, extuw -- l(w)
extsh, extuh -- I(ww)
extsb, extub -- I(ww)
exts -- d(s)
truncd -- s(d)
stosi -- I(ss)
dtosi -- I(dd)
swtof -- F(ww)
sltof -- F(ll)

Расширение точности временного действия выполняется с помощью семейства инструкций ext. Поскольку типы QBE не уточняют наличие или отсуствие знака (например, в LLVM), существуют инструкции расширения, чтобы расширять знак, и нулевое расширение значения. Например, extsb принимает в качестве аргумента w (word) и знак - расширяет 8 младших бит до полного w (word) или l (long), в зависимости от типа возвращаемого значения.

Extending the precision of a temporary is done using the ext family of instructions. Because QBE types do not precise the signedness (like in LLVM), extension instructions exist to sign-extend and zero-extend a value. For example, extsb takes a word argument and sign-extend the 8 least-significant bits to a full word or long, depending on the return type.

Инструкции exts и truncd используются для изменения точности чисел с плавающей запятой. Когда двойной аргумент truncd не может быть представлен как число с плавающей точкой с одинарной точностью, он усекается к нулю.

The instructions exts and truncd are provided to change the precision of a floating point value. When the double argument of truncd cannot be represented as a single-precision floating point, it is truncated towards zero.

Преобразование между целыми знаковыми числами и чисел с плавающей точкой выполняется с использованием инструкции stosi (d - double в знаковое целое), dtosi (d - double в знаковое целое), swtof (знаковое целое w - word во float) и sltof (знаковое l - long во float). Эти инструкции обрабатывают только целые числа со знаком, преобразовывание в и из беззнаковых типов еще не поддерживается.

Converting between signed integers and floating points is done using stosi (single to signed integer), dtosi (double to signed integer), swtof (signed word to float), and sltof (signed long to float). These instructions only handle signed integers, conversion to and from unsigned types are not yet supported.

Благодаря подтипированию нет необходимости в реализации инструкции снижения точности временного целого числа.

Because of Subtyping, there is no need to have an instruction to lower the precision of an integer temporary.



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