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

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

Компилятор номинально совместим с gcc-7.3.0. Здесь мы перечислим ссылки на отдельные пункты из `документации по gcc-7.3.0 <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/>`_, посвящённые builtin'ам, и описанием того, что из всего множества у нас поддержано

* `6.49 Getting the Return or Frame Address of a Function <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Return-Address.html#Return-Address>`_

  | Поддержано с ограничениями:
  | - Функция ``__builtin_return_address`` для e2k поддержана только для параметра с нулевым значением
  | - Функция ``__builtin_frame_address`` поддержана только для параметра с нулевым значением
  | - Функция ``__builtin_frob_return_address`` НЕ поддержана, т.к. не было необходимости. При необходимости можно будет поддержать

* `6.50 Using Vector Instructions through Built-in Functions <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Vector-Extensions.html#Vector-Extensions>`_

  | Поддержано с ограничениями:
  | - Отсутствует поддержка ternary operator ?
  | - Отсутствует поддержка logic operators

* `6.51 Support for offsetof <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Offsetof.html#Offsetof>`_

  | Поддержано

* `6.52 Legacy __sync Built-in Functions for Atomic Memory Access <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/_005f_005fsync-Builtins.html#g_t_005f_005fsync-Builtins>`_

  | Поддержано

  | При работе с 16-байтными переменными имеется особенность, описанная в статье :doc:`atomic16`

  | В защищённом режиме имеется ограничение. С использованием данных функций нельзя строить атомарные операции над дескрипторами (указателями). В данных функциях используется автоматическое определение типа, и для дескриптора в реальности будет построена атомарная операция над типом ``__int128_t``, теряющая тэги

* `6.53 Built-in Functions for Memory Model Aware Atomic Operations <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/_005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins>`_

  | Поддержано

  | При работе с 16-байтными переменными имеется особенность, описанная в статье :doc:`atomic16`

  | В защищённом режиме имеется ограничение. Атомарные операции над дескрипторами (указателями) возможны только при использовании generic-версий функций: т.е. ``__atomic_load``, ``__atomic_store``, ``__atomic_exchange`` и ``__atomic_compare_exchange``. Во прочих версиях функций, использующих автоматическое определение типа, для дескриптора в реальности будет построена атомарная операция над типом ``__int128_t``, теряющая тэги

* `6.54 Built-in Functions to Perform Arithmetic with Overflow Checking <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Integer-Overflow-Builtins.html#Integer-Overflow-Builtins>`_

  | Поддержано с ограничениями:

  | - Если хотя бы один из аргументов или результат функции ``__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 <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/x86-specific-memory-model-extensions-for-transactional-memory.html#x86-specific-memory-model-extensions-for-transactional-memory>`_

  | НЕ поддержано - не было необходимости. При необходимости можно будет реализовать консервативную поддержку

* `6.56 Object Size Checking Built-in Functions <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Object-Size-Checking.html#Object-Size-Checking>`_

  | Поддержано консервативно: код будет компилироваться и исполняться, но не будет контроля за выходом за границу объекта

* `6.57 Pointer Bounds Checker Built-in Functions <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Pointer-Bounds-Checker-builtins.html#Pointer-Bounds-Checker-builtins>`_

  | НЕ поддержано - не было необходимости. При необходимости можно будет реализовать консервативную поддержку: код будет компилироваться и исполняться, но не будет контроля за выходом за границу выделенной области памяти

* `6.58 Cilk Plus C/C++ Language Extension Built-in Functions <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Cilk-Plus-Builtins.html#Cilk-Plus-Builtins>`_

  | НЕ поддержано - в компиляторе отсутствует поддержка языка Cilk Plus C/C++

* `6.59 Other Built-in Functions Provided by GCC <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Other-Builtins.html#Other-Builtins>`_

  | Поддержано с ограничениями:

  * При построении NaN'ов допустимое значение мантиссы ограничено 64-мя битами. Это касается:

    | ``__builtin_nanl``, ``__builtin_nansl`` для e90
    | ``__builtin_nanq``, ``__builtin_nansq`` для e2k и e90

  * Отсутствует поддержка функций для работы с типами ``_Decimal32``, ``_Decimal64``, ``_Decimal128`` (`описание <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Decimal-Float.html#Decimal-Float>`_) всвязи с отсутствием поддержки этих типов:

    | ``__builtin_infd32``, ``__builtin_infd64``, ``__builtin_infd128``
    | ``__builtin_nand32``, ``__builtin_nand64``, ``__builtin_nand128``
    | ``__builtin_signbitd32``, ``__builtin_signbitd64``, ``__builtin_signbitd128``

  * Отсутствует поддержка функций для работы с типами ``_Float32``, ``_Float32x``, ``_Float64``, ``_Float64x``, ``_Float128``, ``_Float128x`` (`описание <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Floating-Types.html#Floating-Types>`_, не путать с типом ``__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 <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/SPARC-VIS-Built-in-Functions.html#SPARC-VIS-Built-in-Functions>`_

  | НЕ поддержано - не было необходимости. При необходимости можно будет поддержать

* `6.60.32 x86 Built-in Functions <https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/x86-Built-in-Functions.html#x86-Built-in-Functions>`_

  | Поддержано с ограничениями:

  | - Функции, которые работают с типом ``__float128``, поддержаны только для e2k. Для e90 (как и для родного sparc) они не нужны, т.к. имеется 128-битный ``long double``

  | - Функции ``__builtin_cpu_*`` на текущий момент поддержаны только для e2k. ``__builtin_cpu_is`` имеет свои собственные параметры, отличающиеся от intel'овских, описание см. в статье :doc:`builtin_mcst`. ``__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

