Продвинутый векторный транслятор — документация, страница 3
Выражения
Для записи выражений в ПВТ используется инфиксный способ, т. е. бинарные операции записываются между операндами, как в большинстве других языков программирования. Унарные операции могут иметь как префиксную, так и постфиксную форму. В качестве операндов могут быть идентификаторы констант, переменных, функций, модулей, а также числовые, символьные и строковые литералы.
В 16-битных и 32-битных программах та или иная операция становится недоступной, если недоступен тип данных, к которому она может быть применена.
Перед тем, как скомпилировать бинарную операцию, ПВТ определяет общий тип данных для обоих операндов в соответствии с этими таблицами, после чего неявно приводит к этому типу оба операнда.
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 |
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 |
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 <идентификатор структуры> |
Создание экземпляра структуры в куче | Создаёт в куче новую структуру и возвращает ссылку на неё. Возможна инициализация полей созданной структуры, пример:
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 не создаёт чего-либо в куче, а является векторным литералом. Таким образом можно записывать значения векторных типов данных. Примеры:
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 вычисляется. |