Поддерживаемые 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_fetch6.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_fetch6.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
