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