# Поддерживаемые 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.53 Support for offsetof

  Поддержано

- 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