Продвинутый векторный транслятор — документация, страница 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 вычисляется. |