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

Выражения

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

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

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

Общие типы данных операндов в 16-битных программах
char byte short float double real
char short short short real real real
byte short short short real real real
short short short short real real real
float real real real float double real
double real real real double double real
real real real real real real real
Общие типы данных операндов в 32-битных программах
char byte short int float double real
char int int int int real real real
byte int int int int real real real
short int int int int real real real
int int int int int real real real
float real real real real float double real
double real real real real double double real
real real real real real real real real
Общие типы данных операндов в 64-битных программах
char byte short int long ultra float double real xvector
char int int int int long ultra real real real
byte int int int int long ultra real real real
short int int int int long ultra real real real
int int int int int long ultra real real real
long long long long long long ultra real real real
ultra ultra ultra ultra ultra ultra ultra
float real real real real real float double real xvector
double real real real real real double double real
real real real real real real real real real
xvector xvector xvector

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

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

Унарные постфиксные операции
Обозначение Название Описание
. Точка Используется для доступа к полю структуры или элементу модуля. После точки обычно следует идентификатор поля структуры или элемента модуля. Если требуется узнать длину массива, то после точки должен стоять идентификатор 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[] {
    /*[0]*/ -3,
    /*[1]*/ 2,
    /*[2]*/ 10
};
int[][] c = new int[b[1]][];
int[][] d = new int[][] {
    /*[0]*/ new int[5],
    /*[1]*/ null,
    /*[2]*/ c[1],
    /*[3]*/ new int[b[2]],
    /*[4]*/ new int[] { 5, -999 }
};
new ultra {…}
new xvector {…}
Векторный литерал Эта особая разновидность операции new не создаёт чего-либо в куче, а является векторным литералом. Таким образом можно записывать значения векторных типов данных. Примеры:
ultra e = new ultra {
    /*[0]*/ -5,
    /*[1]*/ -b[0],
    /*[2]*/ 0,
    /*[3]*/ 6
};
xvector f = new xvector {
    /*[0]*/ 5f,
    /*[1]*/ -3.3f,
    /*[2]*/ -2.6f,
    /*[3]*/ 3.15f
};
Унарные префиксные операции
Обозначение Название Описание
(тип) Приведение к типу Изменяет данные таким образом, что они становятся другого типа. Например:
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 вычисляется.