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

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

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

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

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

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

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

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

  | Поддержано

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

  | Поддержано

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

  | В защищённом режиме отсутствует поддержка следующих функций в ситуации, когда операция выполняется над дескриптором (указателем):
  | - ``__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 <https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/_005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins>`_

  | Поддержано

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

  | В защищённом режиме отсутствует поддержка следующих функций в ситуации, когда операция выполняется над дескриптором (указателем):
  | - ``__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 <https://gcc.gnu.org/onlinedocs/gcc-9.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.57 x86-Specific Memory Model Extensions for Transactional Memory <https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/x86-specific-memory-model-extensions-for-transactional-memory.html#x86-specific-memory-model-extensions-for-transactional-memory>`_

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

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

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

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

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

  * При построении 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`` (`описание <https://gcc.gnu.org/onlinedocs/gcc-9.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-9.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``

* `6.60.28 SPARC VIS Built-in Functions <https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/SPARC-VIS-Built-in-Functions.html#SPARC-VIS-Built-in-Functions>`_

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

* `6.60.33 x86 Built-in Functions <https://gcc.gnu.org/onlinedocs/gcc-9.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*, vaes, vpclmulqdq, а также те специфические расширения, которые не могут быть сделаны без поддержки в аппаратуре. К ним относятся расширения cet, cldemote, fxsr, gfni, lwp, movdir, pconfig, pku, rtm, sgx, waitpkg, wbnoinvd, xsave*, xtest

