Поддерживаемые GNU builtin’ы¶
В данном документе описываются только те builtin’ы, которые позаимствованы у gcc. Собственные builtin’ы описаны в статье Поддерживаемые MCST builtin’ы
Компилятор номинально совместим с gcc-9.3.0. Здесь мы перечислим ссылки на отдельные пункты из документации по gcc-9.3.0, посвящённые builtin’ам, и описанием того, что из всего множества поддержано в lcc
6.51 Getting the Return or Frame Address of a Function
Поддержано с ограничениями:- Функция__builtin_return_address
для e2k поддержана только для параметра с нулевым значением- Функция__builtin_frame_address
поддержана только для параметра с нулевым значением- Функция__builtin_frob_return_address
НЕ поддержана, т.к. не было необходимости. При необходимости можно будет поддержать6.52 Using Vector Instructions through Built-in Functions
Поддержано с ограничениями:- Отсутствует поддержка ternary operator ?- Отсутствует поддержка logic operators-
Поддержано
6.54 Legacy __sync Built-in Functions for Atomic Memory Access
ПоддержаноПри работе с 16-байтными версиями имеется особенность, описанная в статье Потенциальные проблемы при использовании 16-байтных атомарных операцийВ защищённом режиме отсутствует поддержка следующих функций в ситуации, когда операция выполняется над дескриптором (указателем):-__sync_fetch_and_and
,__sync_and_and_fetch
-__sync_fetch_and_nand
,__sync_nand_and_fetch
-__sync_fetch_and_or
,__sync_or_and_fetch
-__sync_fetch_and_xor
,__sync_xor_and_fetch
6.55 Built-in Functions for Memory Model Aware Atomic Operations
ПоддержаноПри работе с 16-байтными версиями имеется особенность, описанная в статье Потенциальные проблемы при использовании 16-байтных атомарных операцийВ защищённом режиме отсутствует поддержка следующих функций в ситуации, когда операция выполняется над дескриптором (указателем):-__atomic_fetch_and
,__atomic_and_fetch
-__atomic_fetch_nand
,__atomic_nand_fetch
-__atomic_fetch_or
,__atomic_or_fetch
-__atomic_fetch_xor
,__atomic_xor_fetch
6.56 Built-in Functions to Perform Arithmetic with Overflow Checking
Поддержано с ограничениями:- Если хотя бы один из аргументов или результат функции__builtin_add_overflow
,__builtin_sub_overflow
или__builtin_mul_overflow
имеют размер 128 бит, то все аргументы и результат должны иметь одинаковую знаковость. В противном случае формально требуется проведение вычислений над 129-битными значениями, это пока не поддержано. В случае компилятора для e90 в режиме-m32
в описании “128 бит” заменяется на “64 бита”, т.к. в этом режиме самый широкий целочисленный тип имеет размер 64 бита- Функции__builtin_add_overflow_p
,__builtin_sub_overflow_p
и__builtin_mul_overflow_p
НЕ поддерживаются в случаях, где требуется constexpr-выражение (инициализаторы, описатели констант enum’а и т.п.)6.57 x86-Specific Memory Model Extensions for Transactional Memory
НЕ поддержано - не было необходимости. При необходимости можно будет реализовать консервативную поддержку6.58 Object Size Checking Built-in Functions
Поддержано консервативно: код будет компилироваться и исполняться, но не будет контроля за выходом за границу объекта6.59 Other Built-in Functions Provided by GCC
Поддержано с ограничениями:При построении NaN’ов допустимое значение мантиссы ограничено 64-мя битами. Это касается:
__builtin_nanl
,__builtin_nansl
для e90__builtin_nanq
,__builtin_nansq
для e2k и e90Функция НЕ поддержана в защищённом режиме, т.к. её смысл противоречит идеологии защищённого режима
__builtin_extend_pointer
Отсутствует поддержка функций, т.к. реальной необходимости не было. При необходимости можно будет поддержать
__builtin_alloca_with_align
__builtin_alloca_with_align_and_max
Отсутствует поддержка функции, т.к. по смыслу она используется только для реализации стандартного заголовка
<tgmath.h>
. В реализации<tgmath.h>
пока обходимся без данного builtin’а__builtin_tgmath
Отсутствует поддержка функции, т.к. реальной необходимости не было, а по описанию gcc нет чёткого понимания
__builtin_call_with_static_chain
Отсутствует поддержка функций
__builtin_speculation_safe_value
__builtin_goacc_parlevel_id
__builtin_goacc_parlevel_size
Отсутствует поддержка функций для работы с типами
_Decimal32
,_Decimal64
,_Decimal128
(описание) всвязи с отсутствием поддержки этих типов:__builtin_infd32
,__builtin_infd64
,__builtin_infd128
__builtin_nand32
,__builtin_nand64
,__builtin_nand128
__builtin_signbitd32
,__builtin_signbitd64
,__builtin_signbitd128
Отсутствует поддержка функций для работы с типами
_Float32
,_Float32x
,_Float64
,_Float64x
,_Float128
,_Float128x
(описание, не путать с типом__float128
) всвязи с отсутствием поддержки этих типов:__builtin_copysignf32
,__builtin_copysignf64
,__builtin_copysignf128
__builtin_copysignf32x
,__builtin_copysignf64x
,__builtin_copysignf128x
__builtin_fabsf32
,__builtin_fabsf64
,__builtin_fabsf128
__builtin_fabsf32x
,__builtin_fabsf64x
,__builtin_fabsf128x
__builtin_huge_valf32
,__builtin_huge_valf64
,__builtin_huge_valf128
__builtin_huge_valf32x
,__builtin_huge_valf64x
,__builtin_huge_valf128x
__builtin_inff32
,__builtin_inff64
,__builtin_inff128
__builtin_inff32x
,__builtin_inff64x
,__builtin_inff128x
__builtin_nanf32
,__builtin_nanf64
,__builtin_nanf128
__builtin_nanf32x
,__builtin_nanf64x
,__builtin_nanf128x
__builtin_nansf32
,__builtin_nansf64
,__builtin_nansf128
__builtin_nansf32x
,__builtin_nansf64x
,__builtin_nansf128x
6.60.28 SPARC VIS Built-in Functions
НЕ поддержано - не было необходимости. При необходимости можно будет поддержать6.60.33 x86 Built-in Functions
Поддержано с ограничениями:- Функции, которые работают с типом__float128
, поддержаны только для e2k. Для e90 (как и для родного sparc) они не нужны, т.к. имеется 128-битныйlong double
- Функции__builtin_cpu_*
на текущий момент поддержаны только для e2k.__builtin_cpu_is
имеет свои собственные параметры, отличающиеся от intel’овских, описание см. в статье Поддерживаемые MCST builtin’ы.__builtin_cpu_supports
НЕ поддержан, т.к. пока не было необходимости- Функции__builtin_ia32_*
поддержаны только для e2k, в виде inline-функций, подключаемых через#include <x86intrin.h>
или#include <immintrin.h>
. Вместо добавления директивы#include
можно использовать опции-include x86intrin.h
или-include immintrin.h
соответственно. НЕ поддержаны функции, реализующие расширения avx512*, vaes, vpclmulqdq, а также те специфические расширения, которые не могут быть сделаны без поддержки в аппаратуре. К ним относятся расширения cet, cldemote, fxsr, gfni, lwp, movdir, pconfig, pku, rtm, sgx, waitpkg, wbnoinvd, xsave*, xtest