Поддерживаемые GNU builtin’ы¶
В данном документе описываются только те builtin’ы, которые есть у gcc. Собственные builtin’ы описаны в статье Поддерживаемые MCST builtin’ы
Компилятор номинально совместим с gcc-7.3.0. Здесь мы перечислим ссылки на отдельные пункты из документации по gcc-7.3.0, посвящённые builtin’ам, и описанием того, что из всего множества у нас поддержано
6.49 Getting the Return or Frame Address of a Function
Поддержано с ограничениями:- Функция__builtin_return_addressдля e2k поддержана только для параметра с нулевым значением- Функция__builtin_frame_addressподдержана только для параметра с нулевым значением- Функция__builtin_frob_return_addressНЕ поддержана, т.к. не было необходимости. При необходимости можно будет поддержать6.50 Using Vector Instructions through Built-in Functions
Поддержано с ограничениями:- Отсутствует поддержка ternary operator ?- Отсутствует поддержка logic operators-
Поддержано
6.52 Legacy __sync Built-in Functions for Atomic Memory Access
ПоддержаноПри работе с 16-байтными переменными имеется особенность, описанная в статье Потенциальные проблемы при использовании 16-байтных атомарных операцийВ защищённом режиме имеется ограничение. С использованием данных функций нельзя строить атомарные операции над дескрипторами (указателями). В данных функциях используется автоматическое определение типа, и для дескриптора в реальности будет построена атомарная операция над типом__int128_t, теряющая тэги6.53 Built-in Functions for Memory Model Aware Atomic Operations
ПоддержаноПри работе с 16-байтными переменными имеется особенность, описанная в статье Потенциальные проблемы при использовании 16-байтных атомарных операцийВ защищённом режиме имеется ограничение. Атомарные операции над дескрипторами (указателями) возможны только при использовании generic-версий функций: т.е.__atomic_load,__atomic_store,__atomic_exchangeи__atomic_compare_exchange. Во прочих версиях функций, использующих автоматическое определение типа, для дескриптора в реальности будет построена атомарная операция над типом__int128_t, теряющая тэги6.54 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.55 x86-Specific Memory Model Extensions for Transactional Memory
НЕ поддержано - не было необходимости. При необходимости можно будет реализовать консервативную поддержку6.56 Object Size Checking Built-in Functions
Поддержано консервативно: код будет компилироваться и исполняться, но не будет контроля за выходом за границу объекта6.57 Pointer Bounds Checker Built-in Functions
НЕ поддержано - не было необходимости. При необходимости можно будет реализовать консервативную поддержку: код будет компилироваться и исполняться, но не будет контроля за выходом за границу выделенной области памяти6.58 Cilk Plus C/C++ Language Extension Built-in Functions
НЕ поддержано - в компиляторе отсутствует поддержка языка Cilk Plus C/C++6.59 Other Built-in Functions Provided by GCC
Поддержано с ограничениями:При построении NaN’ов допустимое значение мантиссы ограничено 64-мя битами. Это касается:
__builtin_nanl,__builtin_nanslдля e90__builtin_nanq,__builtin_nansqдля e2k и e90Отсутствует поддержка функций для работы с типами
_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Отсутствует поддержка функций, т.к. реальной необходимости не было, а по описанию gcc нет чёткого понимания
__builtin_alloca_with_align__builtin_call_with_static_chainОтсутствует поддержка функций, т.к. реальной необходимости не было. При необходимости можно будет поддержать
__builtin___clear_cache__builtin_LINE,__builtin_FUNCTION
6.60.27 SPARC VIS Built-in Functions
НЕ поддержано - не было необходимости. При необходимости можно будет поддержать6.60.32 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*, а также те специфические расширения, которые не могут быть сделаны без поддержки в аппаратуре. К ним относятся расширения fxsr, lwp, pku, rtm, sgx, xsave*, rtm
