Поддерживаемые MCST builtin'ы
=============================

.. contents:: Содержание

.. Для автонумерации нужно использовать директиву
   .. sectnum::
   но она работает дебильно, т.к. автонумерует в том числе и заголовок документа

Общая информация
----------------

В данном документе описываются только собственные builtin'ы. Те builtin'ы, которые позаимствованы у gcc, описаны в статье :doc:`builtin_gnu`

Машинно-независимые builtin'ы
-----------------------------

| ``long`` **__builtin_expect_prob** ``(long expr, double probability)``

  Является аналогом GNU'шного ``__builtin_expect_with_probability`` (описание см. `тут <https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/Other-Builtins.html#Other-Builtins>`_), но имеет более простую сигнатуру. Исторически в lcc появился задолго до появления ``__builtin_expect_with_probability`` в gcc. В будущем данный builtin будет удалён из lcc (DEPRECATED). Вместо него используйте ``__builtin_expect_with_probability``

  .. code-block:: c

     if (__builtin_expect_prob (a > 3, 0.77))
       b = 1;
     else
       b = 2;

  по смыслу означает

  .. code-block:: c

     if (a > 3)
       /* Попадаем в данную ветку с вероятностью 0.77 */
       b = 1;
     else
       b = 2;

| ``long`` **__builtin_expect_with_probability** ``(long expr, long c, double probability)``

  Является GNU'шным расширением, появивишимся в gcc-9.0.0 (на момент выхода данной статьи официального релиза ещё не было). Когда в будущем lcc станет совместим с gcc-9.0.0 или выше, то это будет именно расширением gcc, а до того момента формально позиционируем как расширение МЦСТ. Описание gcc см. `тут <https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/Other-Builtins.html#Other-Builtins>`_

  .. code-block:: c

     if (__builtin_expect_with_probability (a > 3, 1, 0.77))
       b = 1;
     else
       b = 2;

  по смыслу означает

  .. code-block:: c

     if (a > 3) /* Вероятность того, что "a > 3" равно "1" (т.е. true) равна 0.77 */
       b = 1;
     else
       b = 2;

| ``void`` **__builtin_read_barrier** ``(void)``

  Барьер для операций чтения из памяти. Через данную точку кода компилятор НЕ будет переставлять операции чтения из памяти

| ``void`` **__builtin_write_barrier** ``(void)``

  Барьер для операций записи в память. Через данную точку кода компилятор НЕ будет переставлять операции записи в память

| ``void`` **__builtin_mem_barrier** ``(void)``

  Барьер для операций чтения из памяти и и записи в память. Является комбинацией ``__builtin_read_barrier`` и ``__builtin_write_barrier``

| ``void`` **__builtin_barrier** ``(void)``

  Барьер для всех операций. Через данную точку кода компилятор НЕ будет переставлять никакие операции

E2K-зависимые builtin'ы
-----------------------

Обращения в память с MAS'ом
^^^^^^^^^^^^^^^^^^^^^^^^^^^

Данные builtin'ы предназначены для построения операций load/store с использованием MAS (Memory Access Specifier). Во всех builtin'ах данной группы параметр ``addr`` обозначает целевой адрес, параметр ``val`` обозначает записываемое значение (для store'ов), параметр ``mas`` обозначает значение MAS, параметр ``channel`` обозначает номер канала (номер ALU-устройства), параметр ``mask`` означает маску записываемого значения (для pstore'ов)

В качестве параметра ``mas`` можно подать значение ``__LCC_MAS_NO`` для обозначения, отсутствия MAS'а. К параметру ``mas`` через логическое "или" можно добавить значение ``__LCC_MAS_SPEC`` для обозначения спекулятивности операции. К параметру ``mas`` через логическое "или" можно добавить значение ``__LCC_MAS_VOLATILE`` для обозначения обращения в память со смыслом, аналогичным ``volatile`` в языках C/C++. К параметру ``mas`` через логическое "или" можно добавить значение ``__LCC_MAS_CLEARTAG`` для обозначения обращения в память с чисткой тэгов у прочитанного значения (для load'ов)

В качестве параметра ``channel`` можно подать значение ``__LCC_CHAN_ANY`` для обозначения любого допустимого канала

Тип ``v2di`` обозначает ``long long __attribute__((vector_size(16)))``

| ``uint8``  **__builtin_loadmas_8u**  ``(const void *addr, int mas, int channel)``
| ``uint16`` **__builtin_loadmas_16u** ``(const void *addr, int mas, int channel)``
| ``uint32`` **__builtin_loadmas_32u** ``(const void *addr, int mas, int channel)``
| ``uint64`` **__builtin_loadmas_64u** ``(const void *addr, int mas, int channel)``

  Построение операций ldgd*/ld*/ldap* с mas'ом

| ``v2di`` **__builtin_loadmas_128v** ``(const void *addr, int mas, int channel)``

  Построение операций ldgdqp/ldqp/ldapqp с mas'ом. Доступен только для режима ``-march=elbrus-v5`` и выше

| ``void`` **__builtin_storemas_8u**  ``(uint8 val,  void *addr, int mas, int channel)``
| ``void`` **__builtin_storemas_16u** ``(uint16 val, void *addr, int mas, int channel)``
| ``void`` **__builtin_storemas_32u** ``(uint32 val, void *addr, int mas, int channel)``
| ``void`` **__builtin_storemas_64u** ``(uint64 val, void *addr, int mas, int channel)``

  Построение операций stgd*/st*/stap* с mas'ом

| ``void`` **__builtin_storemas_128v** ``(v2di val, void *addr, int mas, int channel)``

  Построение операций stgdqp/stqp/stapqp с mas'ом. Доступен только для режима ``-march=elbrus-v5`` и выше

| ``void`` **__builtin_pstoremas_128v** ``(v2di val, void *addr, unsigned int mask, int mas, int channel)``

  Построение операций stgdmqp/stmqp/stapmqp с mas'ом. Доступен только для режима ``-march=elbrus-v5`` и выше

Вычисление типа процессора в runtime
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

| ``void`` **__builtin_cpu_init** ``(void)``

  Инициализация для работы ``__builtin_cpu_is``, ``__builtin_cpu_name`` и ``__builtin_cpu_arch``. Если указанные builtin'ы`используются в приложениях пользовательского уровня в кодах, которые работают после начала функции ``main``, то вручную вызывать ``__builtin_cpu_init`` нет необходимости (хотя от лишнего вызова ничего плохого не случится), т.к. инициализация выполняется на уровне инициализации языковых конструкторов. Для приложений системного уровня, которые линкуются нестандартным образом, требуется вручную вызвать ``__builtin_cpu_init`` до первого вызова указанных builtin'ов

| ``int`` **__builtin_cpu_is** ``(const char *arg)``

  Проверяет в run-time, удовлетворяет ли процессор, на котором исполняется программа, условию ``arg``, которое должно быть строковым литералом и может принимать следующие значения:

  | ``"elbrus-v1"`` - любой процессор с системой команд v1
  | ``"elbrus-v2"`` - любой процессор с системой команд v2
  | ``"elbrus-v3"`` - любой процессор с системой команд v3
  | ``"elbrus-v4"`` - любой процессор с системой команд v4
  | ``"elbrus-v5"`` - любой процессор с системой команд v5
  | ``"elbrus-v6"`` - любой процессор с системой команд v6
  | ``"elbrus"`` - процессор модели "elbrus" (система команд v1)
  | ``"elbrus-2c+"`` - процессор модели "elbrus-2c+" (система команд v2)
  | ``"elbrus-4c"`` - процессор модели "elbrus-4c" (система команд v3)
  | ``"elbrus-8c"`` - процессор модели "elbrus-8c" (система команд v4)
  | ``"elbrus-1c+"`` - процессор модели "elbrus-1c+" (система команд v4)
  | ``"elbrus-8c2"`` - процессор модели "elbrus-8c2" (система команд v5)
  | ``"elbrus-12c"`` - процессор модели "elbrus-12c" (система команд v6)
  | ``"elbrus-16c"`` - процессор модели "elbrus-16c" (система команд v6)
  | ``"elbrus-2c3"`` - процессор модели "elbrus-2c3" (система команд v6)

  См. так же описание ``__builtin_cpu_init``

| ``const char*`` **__builtin_cpu_name** ``(void)``

  Получить в run-time название модели процессора в виде строки

  См. так же описание ``__builtin_cpu_init``

| ``const char*`` **__builtin_cpu_arch** ``(void)``

  Получить в run-time название архитектуры процессора в виде строки

  См. так же описание ``__builtin_cpu_init``

Builtin'ы для работы с конкретными машинными операциями
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Каждый builtin описывает одну машинную операцию. Имя builtin'а соответствует имени операции по системе команд. Например, действие ``__builtin_e2k_paddb`` соответствует тому, как работает машинная операция ``paddb`` (описание см. в системе команд)

Тип ``v2di`` означает ``long long __attribute__((vector_size(16)))`` - такой же тип, как и в ``__builtin_loadmas_128v``, ``__builtin_storemas_128v``, ``__builtin_pstoremas_128v``

Система команд v1
"""""""""""""""""

| ``uint64`` **__builtin_e2k_paddb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_paddh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_paddw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psubb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psubh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psubw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_paddsb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_paddsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_paddusb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_paddush** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psubsb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psubsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psubusb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psubush** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pavgusb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pavgush** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaxub** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaxsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pminub** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pminsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmulhuh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmulhh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmullh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_umulx** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_smulx** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaddh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psadbw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpeqb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpeqh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpeqw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpgtb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpgth** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpgtw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pandd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pandnd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pord** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pxord** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmovmskb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmovmskps** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmovmskpd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psllh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psllw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pslld** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psrlh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psrlw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psrld** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psrah** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psraw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psllqh** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64`` **__builtin_e2k_psllql** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64`` **__builtin_e2k_psrlqh** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64`` **__builtin_e2k_psrlql** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64 (или uint32)`` **__builtin_e2k_pextrh** ``(uint64 src1, uint64 src2, uint32 src3)``
| ``uint64`` **__builtin_e2k_pinsh** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64`` **__builtin_e2k_pshufw** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64`` **__builtin_e2k_pshufh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_packsshb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_packushb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_packsswh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_punpckhbh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_punpcklbh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_punpckhhw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_punpcklhw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_punpckhwd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_punpcklwd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfadds** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfsubs** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfmaxs** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfmins** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfmuls** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfstois** ``(uint64 src)``
| ``uint64`` **__builtin_e2k_pfstoistr** ``(uint64 src)``
| ``uint64`` **__builtin_e2k_pistofs** ``(uint64 src)``
| ``uint64`` **__builtin_e2k_pfcmpeqs** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmplts** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmples** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpuods** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpneqs** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpnlts** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpnles** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpods** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_fdtoid** ``(uint64 src)``
| ``uint32`` **__builtin_e2k_fstois** ``(uint32 src)``
| ``uint32`` **__builtin_e2k_fdtois** ``(uint64 src)``
| ``uint32`` **__builtin_e2k_fcmpodsf** ``(uint32 src1, uint32 src2)``
| ``uint32`` **__builtin_e2k_fcmpudsf** ``(uint32 src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_idtofd** ``(uint64 src)``
| ``uint64`` **__builtin_e2k_pfcmpeqd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpltd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpled** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpuodd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpneqd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpnltd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpnled** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfcmpodd** ``(uint64 src1, uint64 src2)``
| ``uint32`` **__builtin_e2k_scls** ``(uint32 src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_scld** ``(uint64 src1, uint64 src2)``
| ``uint32`` **__builtin_e2k_scrs** ``(uint32 src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_scrd** ``(uint64 src1, uint64 src2)``
| ``uint32`` **__builtin_e2k_insfs** ``(uint32 src1, uint32 src2, uint32 src3)``
| ``uint64`` **__builtin_e2k_insfd** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint32`` **__builtin_e2k_getfs** ``(uint32 src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_getfd** ``(uint64 src1, uint64 src2)``

Следующие builtin'ы реализованы в виде inline-функций или макросов и требуют подключения ``#include <e2kintrin.h>`` или использования опции ``-include e2kintrin.h``

| ``uint64`` **__builtin_e2k_puttagd** ``(uint64 src1, uint64 src2)``
| ``uint32`` **__builtin_e2k_ld_32u_be** ``(const void *pval)``
| ``uint32`` **__builtin_e2k_ld_32u_t1** ``(const void *pval)``
| ``uint32`` **__builtin_e2k_ld_32u_t2** ``(const void *pval)``
| ``uint32`` **__builtin_e2k_ld_32u_nta** ``(const void *pval)``
| ``uint64`` **__builtin_e2k_ld_64s_be** ``(const void *pval)``
| ``uint64`` **__builtin_e2k_ld_64s_t1** ``(const void *pval)``
| ``uint64`` **__builtin_e2k_ld_64s_t2** ``(const void *pval)``
| ``uint64`` **__builtin_e2k_ld_64s_nta** ``(const void *pval)``
| ``uint64`` **__builtin_e2k_ld_64s_sm** ``(const void *pval, long ind)``
| ``uint64`` **__builtin_e2k_ld_64s_cleartag** ``(const void *pval, long ind)``
| ``void`` **__builtin_e2k_st_32u_be** ``(uint32 val, void *pval)``
| ``void`` **__builtin_e2k_st_32u_nt** ``(uint32 val, void *pval)``
| ``void`` **__builtin_e2k_st_64s_be** ``(uint64 val, void *pval)``
| ``void`` **__builtin_e2k_st_64s_nt** ``(uint64 val, void *pval)``
| ``void`` **__builtin_e2k_clflush** ``(void *p)``
| ``uint64`` **__builtin_e2k_prefetch** ``(void *p, __e2k_hint i)``

Система команд v2
"""""""""""""""""

| ``uint32`` **__builtin_e2k_bitrevs** ``(uint32 src)``
| ``uint64`` **__builtin_e2k_bitrevd** ``(uint64 src)``
| ``uint32`` **__builtin_e2k_lzcnts** ``(uint32 src)``
| ``uint64`` **__builtin_e2k_lzcntd** ``(uint64 src)``
| ``uint32`` **__builtin_e2k_popcnts** ``(uint32 src)``
| ``uint64`` **__builtin_e2k_pmulubhh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pshufb** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64`` **__builtin_e2k_pmerge** ``(uint64 src1, uint64 src2, uint64 src3)``
| ``uint64`` **__builtin_e2k_fdtoidtr** ``(uint64 src)``

Система команд v3
"""""""""""""""""

| ``uint64`` **__builtin_e2k_phaddh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_phaddw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_phsubh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_phsubw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_phaddsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_phsubsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaxsb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaxuh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaxuw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaxsw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pminsb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pminuh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pminuw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pminsw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_phminposuh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmaddubsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pmulhrsh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_umulhd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_smulhd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_mpsadbh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpeqd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pcmpgtd** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_packuswh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psignb** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psignh** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psignw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfhadds** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfhsubs** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_pfaddsubs** ``(uint64 src1, uint64 src2)``
| ``uint32`` **__builtin_e2k_fstoifs** ``(uint32 src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_pfstoifs** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_fdtoifd** ``(uint64 src1, uint64 src2)``

Система команд v4
"""""""""""""""""

| ``uint32`` **__builtin_e2k_fscales** ``(uint32 src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_fscaled** ``(uint64 src1, uint32 src2)``

Система команд v5
"""""""""""""""""

| ``v2di`` **__builtin_e2k_qpaddb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpaddh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpaddw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpaddd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpaddsb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpaddsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpaddusb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpaddush** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubsb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubusb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsubush** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qphaddsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qphsubsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaxub** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaxsb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaxuh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaxsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaxuw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaxsw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpminub** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpminsb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpminuh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpminsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpminuw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpminsw** ``(v2di src1, v2di src2)``
| ``uint64`` **__builtin_e2k_qphminposuh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmulhuh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmulhh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmullh** ``(v2di src1, v2di src2)``
| ``uint64`` **__builtin_e2k_pmullw** ``(uint64 src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpmullw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmulubhh** ``(uint64 src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmulhrsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaddh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmaddubsh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsignb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsignh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsignw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpsadbw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpmpsadbh** ``(v2di src1, uint32 src2)``
| ``v2di`` **__builtin_e2k_qpavgusb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpavgush** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpeqb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpeqh** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpeqw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpeqd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpgtb** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpgth** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpgtw** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpcmpgtd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpshufb** ``(v2di src1, v2di src2, v2di src3)``
| ``v2di`` **__builtin_e2k_qppermb** ``(v2di src1, v2di src2, v2di src3)``
| ``v2di`` **__builtin_e2k_qpmerge** ``(v2di src1, v2di src2, v2di src3)``
| ``v2di`` **__builtin_e2k_qppackdl** ``(uint64 src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpswitchd** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpswitchw** ``(v2di src)``
| ``uint32`` **__builtin_e2k_qpsgn2mskb** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpmsk2sgnb** ``(v2di src1, uint32 src2)``
| ``v2di`` **__builtin_e2k_qpand** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpandn** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpor** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpxor** ``(v2di src1, v2di src2)``
| ``uint64`` **__builtin_e2k_plog** ``(uint32 n, uint64 src1, uint64 src2, uint64 src3)``
| ``v2di`` **__builtin_e2k_qplog** ``(uint32 n, v2di src1, v2di src2, v2di src3)``
| ``v2di`` **__builtin_e2k_qpsllh** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsllw** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpslld** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsrlh** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsrlw** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsrld** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsrah** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsraw** ``(v2di src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psrcw** ``(uint64 src1, uint64 src2)``
| ``uint64`` **__builtin_e2k_psrcd** ``(uint64 src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsrcw** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpsrcd** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpacksshb** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpackushb** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpacksswh** ``(v2di src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_qpackuswh** ``(v2di src1, uint64 src2)``
| ``uint32`` **__builtin_e2k_getfzs** ``(uint32 src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_getfzd** ``(uint64 src1, uint64 src2)``
| ``v2di`` **__builtin_e2k_puttagqp** ``(v2di src1, uint32 src2)``
| ``uint64`` **__builtin_e2k_addcd** ``(uint64 src1, uint64 src2, uint32 src3)``
| ``uint64`` **__builtin_e2k_subcd** ``(uint64 src1, uint64 src2, uint32 src3)``
| ``uint64`` **__builtin_e2k_addcd_c** ``(uint64 src1, uint64 src2, uint32 src3)``
| ``uint64`` **__builtin_e2k_subcd_c** ``(uint64 src1, uint64 src2, uint32 src3)``
| ``v2di`` **__builtin_e2k_qpfadds** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfhadds** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfsubs** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfhsubs** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfaddsubs** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfmaxs** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfmins** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfmuls** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpeqs** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmplts** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmples** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpuods** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpneqs** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpnlts** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpnles** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpods** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfstois** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfstoistr** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpistofs** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpidtofs** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfstoifs** ``(uint64 src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfstofd** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfstoid** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfstoidtr** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfaddd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfsubd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfaddsubd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfmaxd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfmind** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfmuld** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpeqd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpltd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpled** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpuodd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpneqd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpnltd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpnled** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfcmpodd** ``(v2di src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfdtois** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfdtoistr** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpistofd** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpidtofd** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfdtoifd** ``(uint64 src1, v2di src2)``
| ``v2di`` **__builtin_e2k_qpfdtofs** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfdtoid** ``(v2di src)``
| ``v2di`` **__builtin_e2k_qpfdtoidtr** ``(v2di src)``

Следующие builtin'ы реализованы в виде inline-функций или макросов и требуют подключения ``#include <e2kintrin.h>`` или использования опции ``-include e2kintrin.h``

| ``v2di`` **__builtin_e2k_ld_128_be** ``(const void *pval)``
| ``v2di`` **__builtin_e2k_ld_128_t1** ``(const void *pval)``
| ``v2di`` **__builtin_e2k_ld_128_t2** ``(const void *pval)``
| ``v2di`` **__builtin_e2k_ld_128_nta** ``(const void *pval)``
| ``v2di`` **__builtin_e2k_ld_128_sm** ``(const v2di *pval, long ind)``
| ``v2di`` **__builtin_e2k_ld_128_cleartag** ``(const v2di *pval, long ind)``
| ``void`` **__builtin_e2k_st_128_be** ``(v2di val, v2di *pval)``
| ``void`` **__builtin_e2k_st_128_nt** ``(v2di val, v2di *pval)``
| ``void`` **__builtin_e2k_pst_128** ``(v2di val, v2di *pval, uint32 mask)``
| ``void`` **__builtin_e2k_pst_128_be** ``(v2di val, v2di *pval, uint32 mask)``

Система команд v6
"""""""""""""""""

| ``uint32`` **__builtin_e2k_pcmpeqbop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpeqhop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpeqwop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpeqdop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpeqbap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpeqhap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpeqhap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpeqdap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgtbop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgthop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgtwop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgtdop** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgtbap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgthap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgtwap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_pcmpgtdap** ``(uint64, uint64)``
| ``uint32`` **__builtin_e2k_qpcmpeqbop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpeqhop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpeqwop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpeqdop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpeqbap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpeqhap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpeqwap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpeqdap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgtbop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgthop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgtwop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgtdop** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgtbap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgthap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgtwap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_qpcmpgtdap** ``(v2di, v2di)``
| ``uint32`` **__builtin_e2k_fmas** ``(uint32, uint32, uint32)``
| ``uint64`` **__builtin_e2k_fmad** ``(uint64, uint64, uint64)``
| ``uint32`` **__builtin_e2k_fmss** ``(uint32, uint32, uint32)``
| ``uint64`` **__builtin_e2k_fmsd** ``(uint64, uint64, uint64)``
| ``uint32`` **__builtin_e2k_fnmas** ``(uint32, uint32, uint32)``
| ``uint64`` **__builtin_e2k_fnmad** ``(uint64, uint64, uint64)``
| ``uint32`` **__builtin_e2k_fnmss** ``(uint32, uint32, uint32)``
| ``uint64`` **__builtin_e2k_fnmsd** ``(uint64, uint64, uint64)``
| ``v2di`` **__builtin_e2k_qpfmas** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfmad** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfmss** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfmsd** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfnmas** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfnmad** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfnmss** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfnmsd** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfmass** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfmasd** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfmsas** ``(v2di, v2di, v2di)``
| ``v2di`` **__builtin_e2k_qpfmsad** ``(v2di, v2di, v2di)``
| ``uint64`` **__builtin_e2k_clmull** ``(uint64, uint64)``
| ``uint64`` **__builtin_e2k_clmulh** ``(uint64, uint64)``

Builtin'ы для работы в защищённом режиме
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Данные builtin'ы поддерживаются только в защищённом режиме

| ``uint64`` **__builtin_e2k_get_ap_base** ``(const void *ap)``

  У дескриптора AP взять поле AP.base

| ``uint32`` **__builtin_e2k_get_ap_size** ``(const void *ap)``

  У дескриптора AP взять поле AP.size

| ``uint32`` **__builtin_e2k_get_ap_curptr** ``(const void *ap)``

  У дескриптора AP взять поле AP.curptr

| ``void*`` **__builtin_e2k_create_ap_subarray** ``(const void *ap, uint32 offset, uint32 size)``

  На базе существующего дескриптора AP построить новый дескриптор, описывающий
  подмассив размером ``size`` и начинающийся со смещением ``offset`` внутри
  входного дескриптора AP

| ``uint32`` **__builtin_e2k_load_gettags** ``(const void *addr)``
| ``uint32`` **__builtin_e2k_load_gettagd** ``(const void *addr)``

  Из памяти по адресу ``addr`` прочитать тэг у фрагмента памяти рамзером 4/8 байт. Адрес ``addr`` должен быть выровнен на 4/8 байт. Если по указанному адресу лежит дескриптор, то при чтении фрагмента тэг потеряется. Это особенность работы аппаратуры - чтобы не было возможности сконструировать дескриптор из отдельных кусков

E90-зависимые builtin'ы
-----------------------

Обращения в память с ASI-кодом
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Данные builtin'ы предназначены для построения операций load/store с использованием ASI-кода (Address Space Identifier). Во всех builtin'ах данной группы параметр ``addr`` обозначает целевой адрес, параметр ``index`` означает смещение к адресу (т.е. реальное обращение в память проходит по адресу ``addr + index``), параметр ``val`` обозначает записываемое значение (для store'ов), параметр ``asi`` обозначает значение ASI-кода, параметр ``mask`` означает маску записываемого значения (для pstore'ов)

| ``uint8``   **__builtin_loadasi_8u**  ``(const void *addr, long index, int asi)``
| ``uint16``  **__builtin_loadasi_16u** ``(const void *addr, long index, int asi)``
| ``uint32``  **__builtin_loadasi_32u** ``(const void *addr, long index, int asi)``
| ``float32`` **__builtin_loadasi_32f** ``(const void *addr, long index, int asi)``
| ``float64`` **__builtin_loadasi_64f** ``(const void *addr, long index, int asi)``

  Построение операций load с ASI-кодом

| ``void`` **__builtin_storeasi_64f**  ``(float64 val, void *addr, long index, int asi)``
| ``void`` **__builtin_pstoreasi_64f** ``(float64 val, void *addr, int mask,   int asi)``

  Построение операций store с ASI-кодом

