Продвинутый векторный транслятор: документация (страница 3)

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

выражения

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

В 16-битных и 32-битных программах та или иная операция становится недоступной, если недоступен тип данных, к которому она может быть применена.

Перед тем, как скомпилировать бинарную операцию, ПВТ определяет общий тип данных для обоих операндов в соответствии с этими таблицами, после чего неявно приводит к этому типу оба операнда.

Общие типы данных операндов в 16-битных программах:

Общие типы данных операндов в 32-битных программах:

Общие типы данных операндов в 64-битных программах:

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

Операций в ПВТ довольно много, и им посвящён этот раздел документации.

Унарные постфиксные операции

Обозначение Название Описание
. Точка Используется для доступа к полю структуры или элементу модуля. После точки обычно следует идентификатор поля структуры или элемента модуля. Если требуется узнать длину массива, то после точки должен стоять идентификатор length.
Применимо к типам: ссылка на структуру, ссылка на дескриптор массива
Также применимо к: идентификатор модуля
++ Инкремент Выполняет увеличение на 1 значения переменной, однако в качестве значения переменной в выражении используется значение до увеличения.
Применимо к типам: char, byte, short, int, long, float, double, real
-- Декремент Выполняет уменьшение на 1 значения переменной, однако в качестве значения переменной в выражении используется значение до уменьшения.
Применимо к типам: char, byte, short, int, long, float, double, real
[индекс] Доступ к элементу массива или вектора Выполняет доступ к произвольному элементу массива или вектора по индексу. Индекс имеет тип int (short в 16-битных программах). Нумерация элементов всегда начинается с нуля.
Применимо к типам: ultra, xvector, ссылка на дескриптор массива
(аргументы) Вызов функции Выполняет вызов функции. Аргументы записываются через запятую.
Применимо к типам: ссылка на функцию
Также применимо к: функция

Операции new:

Обозначение Название Описание
new <идентификатор структуры> Создание экземпляра структуры в куче Создаёт в куче новую структуру и возвращает ссылку на неё. Возможна инициализация полей созданной структуры, пример:

Window wnd = new Window {
    visible = true,
    enabled = true,
    width = 240,
    height = 320,
    caption = "Новое окно",
    paint = wndPaint
};
new тип[длина][][]…[] Создание экземпляра массива в куче Создаёт в куче новый массив и возвращает ссылку на его дескриптор. Возможна инициализация элементов массива вместо указания длины. Примеры:

short[] a = new short[5];
byte[] b = new byte[] {
    -3, /*[0]*/
    2, /*[1]*/
    10 /*[2]*/
};
int[][] c = new int[b[1]][];
int[][] d = new int[][] {
    new int[5], /*[0]*/
    null, /*[1]*/
    c[1], /*[2]*/
    new int[b[2]], /*[3]*/
    new int[] { 5, -999 } /*[4]*/
};
new ultra {…}
new xvector {…}
Векторный литерал Эта особая разновидность операции new не создаёт чего-либо в куче, а является векторным литералом. Таким образом можно записывать значения векторных типов данных. Примеры:

ultra e = new ultra {
    -5, /*[0]*/
    -b[0], /*[1]*/
    0, /*[2]*/
    6 /*[3]*/
};
xvector f = new xvector {
    5f, /*[0]*/
    -3.3f, /*[1]*/
    -2.6f, /*[2]*/
    3.15f /*[3]*/
};

Унарные префиксные операции:

Обозначение Название Описание
(тип) Приведение к типу Изменяет данные таким образом, что они становятся другого типа. Например:

float g = -3.94f;
int h = (int) g; /* h = -3 */

Применимо к типам: любой

~ Побитовая инверсия Меняет все биты на противоположные.
Применимо к типам: char, byte, short, int, long, ultra
! Логическое отрицание Меняет логическое значение на противоположное.
Применимо к типам: boolean
+ Унарный плюс Может использоваться для изменения типа выражения с char, byte, short на int. В 16-битных программах тип выражения меняется на short.
Применимо к типам: char, byte, short, int, long, float, double, real
- Унарный минус Меняет знак числа на противоположный.
Применимо к типам: char, byte, short, int, long, float, double, real
++ Инкремент Выполняет увеличение на 1 значения переменной.
Применимо к типам: char, byte, short, int, long, float, double, real
-- Декремент Выполняет уменьшение на 1 значения переменной.
Применимо к типам: char, byte, short, int, long, float, double, real
@@@@ Упаковка вектора из 4 элементов Выполняет упаковку с беззнаковым насыщением вектора из четырёх элементов.
Применимо к типам: long, ultra
Тип результата: int, long
Требования: SSE4.1 требуется для упаковки значения типа ultra.
#### Нижняя распаковка в вектор из 4 элементов Выполняет распаковку байтов или слов в нижние разряды вектора из четырёх элементов.
Применимо к типам: int, long
Тип результата: long, ultra
^^^^ Верхняя распаковка в вектор из 4 элементов Выполняет распаковку байтов или слов в верхние разряды вектора из четырёх элементов.
Применимо к типам: int, long
Тип результата: long, ultra
++++ Унарный плюс для вектора из 4 элементов Может использоваться для изменения типа выражения с char, byte, short, int на long или с float на xvector.
Применимо к типам: char, byte, short, int, long, ultra, float, xvector
---- Унарный минус для вектора из 4 элементов Меняет знак всех четырёх элементов вектора на противоположный.
Применимо к типам: long, ultra, xvector
@@..@@ Упаковка вектора из 8 элементов Выполняет упаковку с беззнаковым насыщением вектора из восьми элементов.
Применимо к типам: ultra
Тип результата: long
##..## Нижняя распаковка в вектор из 8 элементов Выполняет распаковку байтов в нижние разряды вектора из восьми элементов.
Применимо к типам: long
Тип результата: ultra
^^..^^ Верхняя распаковка в вектор из 8 элементов Выполняет распаковку байтов в верхние разряды вектора из восьми элементов.
Применимо к типам: long
Тип результата: ultra
++..++ Унарный плюс для вектора из 8 элементов Может использоваться для изменения типа выражения с char, byte, short, int, long на ultra.
Применимо к типам: char, byte, short, int, long, ultra
--..-- Унарный минус для вектора из 8 элементов Меняет знак всех восьми элементов вектора на противоположный.
Применимо к типам: ultra

Бинарные операции:

Обозначение Название Описание
= Присвоение значения Выполняет запись значения выражения (второй операнд) в переменную (первый операнд).
Применимо к типам: все
*
*=
Умножение Выполняет умножение двух операндов без присвоения или с присвоением значения.
Применимо к типам: short, int, long, float, double, real
/
/=
Деление Выполняет деление первого операнда на второй без присвоения или с присвоением значения. Для целочисленных типов данных результат округляется в сторону нуля.
Применимо к типам: short, int, long, float, double, real
//
//=
Беззнаковое деление Выполняет деление первого операнда на второй без присвоения или с присвоением значения. Если операнды имеют целочисленный тип данных, то их значения считаются беззнаковыми.
Применимо к типам: short, int, long, float, double, real
%
%=
Остаток от деления Вычисляет остаток от деления первого операнда на второй без присвоения или с присвоением значения.
Применимо к типам: short, int, long, float, double, real
%%
%%=
Беззнаковый остаток от деления Вычисляет остаток от деления первого операнда на второй без присвоения или с присвоением значения. Если операнды имеют целочисленный тип данных, то их значения считаются беззнаковыми.
Применимо к типам: short, int, long, float, double, real
+
+=
Сложение Выполняет сложение двух операндов без присвоения или с присвоением значения.
Применимо к типам: short, int, long, float, double, real
-
-=
Вычитание Выполняет вычитание второго операнда из первого без присвоения или с присвоением значения.
Применимо к типам: short, int, long, float, double, real
>>
>>=
Арифметический сдвиг вправо Выполняет арифметический сдвиг вправо первого операнда на количество битов, равное второму операнду, без присвоения или с присвоением значения. Эта операция эквивалентна целочисленному делению на степень двойки с округлением в сторону минус бесконечности.
Тип первого операнда: short, int, long
Тип второго операнда: short, int
>>>
>>>=
Беззнаковый сдвиг вправо Выполняет беззнаковый сдвиг вправо первого операнда на количество битов, равное второму операнду, без присвоения или с присвоением значения.
Тип первого операнда: short, int, long
Тип второго операнда: short, int
<<
<<=
Сдвиг влево Выполняет сдвиг влево первого операнда на количество битов, равное второму операнду, без присвоения или с присвоением значения. Эта операция эквивалентна умножению на степень двойки.
Тип первого операнда: short, int, long
Тип второго операнда: short, int
<
>
<=
>=
==
!=
Сравнение Выполняет сравнение двух операндов и возвращает значение типа boolean. Каждая из этих шести операций сравнения выполняет следующее:
< : первый операнд меньше второго;
> : первый операнд больше второго;
<= : первый операнд меньше или равен второму;
>= : первый операнд больше или равен второму;
== : первый операнд равен второму;
!= : первый операнд не равен второму.
Замечание: при сравнении действительного числа с «не-числом» (или двух «не-чисел») результат true будет давать только !=, остальные операции будут давать false.
Применимо к типам: short, int, long, float, double, real
== и != применимы к любым совместимым типам.
&
&=
Побитовое «И» Выполняет операцию побитового «И» двух операндов без присвоения или с присвоением значения.
Применимо к типам: boolean, short, int, long, ultra
^
^=
Побитовое «Исключающее ИЛИ» Выполняет операцию побитового «Исключающего ИЛИ» двух операндов без присвоения или с присвоением значения.
Применимо к типам: boolean, short, int, long, ultra
|
|=
Побитовое «ИЛИ» Выполняет операцию побитового «ИЛИ» двух операндов без присвоения или с присвоением значения.
Применимо к типам: boolean, short, int, long, ultra
&& Логическое «И» Выполняет операцию логического «И» для двух операндов типа boolean. Если первый операнд дал результат false, то второй операнд будет пропущен (т. е. не будет вычислен).
Применимо к типам: boolean
|| Логическое «ИЛИ» Выполняет операцию логического «ИЛИ» для двух операндов типа boolean. Если первый операнд дал результат true, то второй операнд будет пропущен (т. е. не будет вычислен).
Применимо к типам: boolean
****
****=
Умножение векторов из 4 элементов Выполняет умножение каждого элемента вектора в первом операнде на соответствующий элемент вектора во втором операнде без присвоения или с присвоением значения.
Наборы инструкций: если разрешить генерацию кода под SSE4.1, то для векторов типа ultra эта операция будет производиться в одну инструкцию ассемблера.
Применимо к типам: long, ultra, xvector
***^
***^=
Беззнаковое умножение векторов из 4 элементов Выполняет беззнаковое умножение с сохранением старшей части каждого элемента вектора в первом операнде на соответствующий элемент вектора во втором операнде без присвоения или с присвоением значения.
Эта операция эквивалентна умножению векторов с элементами в числовом промежутке [0; 1).
Применимо к типам: long, ultra
***|
***|=
Знаковое умножение векторов из 4 элементов Выполняет знаковое умножение с сохранением старшей части каждого элемента вектора в первом операнде на соответствующий элемент вектора во втором операнде без присвоения или с присвоением значения.
Эта операция эквивалентна умножению векторов с элементами в числовом промежутке [–1; 1).
Наборы инструкций: если разрешить генерацию кода под SSSE3, то эта операция будет производиться в одну инструкцию ассемблера.
Применимо к типам: long
////
////=
Деление векторов из 4 элементов Выполняет деление каждого элемента вектора в первом операнде на соответствующий элемент вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: xvector
++++
++++=
Сложение векторов из 4 элементов Выполняет сложение каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: long, ultra, xvector
+++|
+++|=
Сложение со знаковым насыщением векторов из 4 элементов Выполняет сложение со знаковым насыщением каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: long
+++#
+++#=
Сложение с беззнаковым насыщением векторов из 4 элементов Выполняет сложение с беззнаковым насыщением каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: long
----
----=
Вычитание векторов из 4 элементов Выполняет вычитание каждого элемента вектора во втором операнде из соответствующих элементов вектора в первом операнде без присвоения или с присвоением значения.
Применимо к типам: long, ultra, xvector
---|
---|=
Вычитание со знаковым насыщением векторов из 4 элементов Выполняет вычитание со знаковым насыщением каждого элемента вектора во втором операнде из соответствующих элементов вектора в первом операнде без присвоения или с присвоением значения.
Применимо к типам: long
---#
---#=
Вычитание с беззнаковым насыщением векторов из 4 элементов Выполняет вычитание с беззнаковым насыщением каждого элемента вектора во втором операнде из соответствующих элементов вектора в первом операнде без присвоения или с присвоением значения.
Применимо к типам: long
>>>>
>>>>=
Арифметический сдвиг вправо вектора из 4 элементов Выполняет арифметический сдвиг вправо каждого элемента вектора в первом операнде на количество битов, равное второму операнду, без присвоения или с присвоением значения.
Тип первого операнда: long, ultra
Тип второго операнда: int
>>>>>
>>>>>=
Беззнаковый сдвиг вправо вектора из 4 элементов Выполняет беззнаковый сдвиг вправо каждого элемента вектора в первом операнде на количество битов, равное второму операнду, без присвоения или с присвоением значения.
Тип первого операнда: long, ultra
Тип второго операнда: int
<<<<
<<<<=
Сдвиг влево вектора из 4 элементов Выполняет сдвиг влево каждого элемента вектора в первом операнде на количество битов, равное второму операнду, без присвоения или с присвоением значения.
Тип первого операнда: long, ultra
Тип второго операнда: int
<<||
>>||
<=||
>=||
==||
!=||
Сравнение векторов из 4 элементов Выполняет сравнение каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде. Если условие сравнения выполняется, то в соответствующий элемент результата записывается значение -1, иначе – значение 0.
Применимо к типам: long, ultra, xvector
Тип результата: long, ultra
<<||=
>>||=
<=||=
>=||=
==||=
!=||=
Сравнение векторов из 4 элементов с присвоением значения Выполняет сравнение каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде с присвоением значения. Если условие сравнения выполняется, то в соответствующий элемент результата записывается значение -1, иначе – значение 0.
Применимо к типам: long, ultra
**..**
**..**=
Умножение векторов из 8 элементов Выполняет умножение каждого элемента вектора в первом операнде на соответствующий элемент вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: ultra
**..*^
**..*^=
Беззнаковое умножение векторов из 8 элементов Выполняет беззнаковое умножение с сохранением старшей части каждого элемента вектора в первом операнде на соответствующий элемент вектора во втором операнде без присвоения или с присвоением значения.
Эта операция эквивалентна умножению векторов с элементами в числовом промежутке [0; 1).
Применимо к типам: ultra
**..*|
**..*|=
Знаковое умножение векторов из 8 элементов Выполняет знаковое умножение с сохранением старшей части каждого элемента вектора в первом операнде на соответствующий элемент вектора во втором операнде без присвоения или с присвоением значения.
Эта операция эквивалентна умножению векторов с элементами в числовом промежутке [–1; 1).
Наборы инструкций: если разрешить генерацию кода под SSSE3, то эта операция будет производиться в одну инструкцию ассемблера.
Применимо к типам: ultra
++..++
++..++=
Сложение векторов из 8 элементов Выполняет сложение каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: ultra
++..+|
++..+|=
Сложение со знаковым насыщением векторов из 8 элементов Выполняет сложение со знаковым насыщением каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: ultra
++..+#
++..+#=
Сложение с беззнаковым насыщением векторов из 8 элементов Выполняет сложение с беззнаковым насыщением каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде без присвоения или с присвоением значения.
Применимо к типам: ultra
--..--
--..--=
Вычитание векторов из 8 элементов Выполняет вычитание каждого элемента вектора во втором операнде из соответствующих элементов вектора в первом операнде без присвоения или с присвоением значения.
Применимо к типам: ultra
--..-|
--..-|=
Вычитание со знаковым насыщением векторов из 8 элементов Выполняет вычитание со знаковым насыщением каждого элемента вектора во втором операнде из соответствующих элементов вектора в первом операнде без присвоения или с присвоением значения.
Применимо к типам: ultra
--..-#
--..-#=
Вычитание с беззнаковым насыщением векторов из 8 элементов Выполняет вычитание с беззнаковым насыщением каждого элемента вектора во втором операнде из соответствующих элементов вектора в первом операнде без присвоения или с присвоением значения.
Применимо к типам: ultra
>>..>>
>>..>>=
Арифметический сдвиг вправо вектора из 8 элементов Выполняет арифметический сдвиг вправо каждого элемента вектора в первом операнде на количество битов, равное второму операнду, без присвоения или с присвоением значения.
Тип первого операнда: ultra
Тип второго операнда: int
>>..>>>
>>..>>>=
Беззнаковый сдвиг вправо вектора из 8 элементов Выполняет беззнаковый сдвиг вправо каждого элемента вектора в первом операнде на количество битов, равное второму операнду, без присвоения или с присвоением значения.
Тип первого операнда: ultra
Тип второго операнда: int
<<..<<
<<..<<=
Сдвиг влево вектора из 8 элементов Выполняет сдвиг влево каждого элемента вектора в первом операнде на количество битов, равное второму операнду, без присвоения или с присвоением значения.
Тип первого операнда: ultra
Тип второго операнда: int
<<|..|
>>|..|
<=|..|
>=|..|
==|..|
!=|..|
<<|..|=
>>|..|=
<=|..|=
>=|..|=
==|..|=
!=|..|=
Сравнение векторов из 8 элементов Выполняет сравнение каждого элемента вектора в первом операнде с соответствующим элементом вектора во втором операнде без присвоения или с присвоением значения. Если условие сравнения выполняется, то в соответствующий элемент результата записывается значение -1, иначе – значение 0.
Применимо к типам: ultra

Тернарные операции:

Обозначение Название Описание
?: Условная тернарная операция Записывается как
a ? b : c
и интерпретируется как «если a, то b, иначе c». Выражение a имеет тип boolean, выражения b и c имеют совместимые типы. Сперва вычисляется выражение a. Если оно имеет значение true, то вычисляется b, c пропускается. Если выражение a имеет значение false, то b пропускается, c вычисляется.

Далее