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

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

В данном документе описываются только собственные builtin’ы. Те builtin’ы, которые позаимствованы у gcc, описаны в статье Поддерживаемые GNU builtin’ы

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

long __builtin_expect_prob (long expr, double probability)

Является аналогом GNU’шного __builtin_expect_with_probability (описание см. тут), но имеет более простую сигнатуру. Исторически в lcc появился задолго до появления __builtin_expect_with_probability в gcc. В будущем данный builtin будет удалён из lcc (DEPRECATED). Вместо него используйте __builtin_expect_with_probability

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

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

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 см. тут

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

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

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-кодом