Spec-Zone.ru › GCC 15

6.4.1.33 Атрибуты функций x86

В бэкенде x86 поддерживаются следующие атрибуты функций:

cdecl

На целевых платформах x86-32 атрибут cdecl заставляет компилятор считать, что вызывающая функция удаляет из стека область, использованную для передачи аргументов. Это полезно для переопределения действия параметра -mrtd.

fastcall

На целевых платформах x86-32 атрибут fastcall заставляет компилятор передавать первый аргумент (если он имеет целочисленный тип) в регистре ECX, а второй аргумент (если он имеет целочисленный тип) — в регистре EDX. Последующие аргументы и аргументы других типов передаются через стек. Вызываемая функция удаляет аргументы из стека. Если число аргументов переменное, все аргументы помещаются в стек.

thiscall

На целевых платформах x86-32 атрибут thiscall заставляет компилятор передавать первый аргумент (если он имеет целочисленный тип) в регистре ECX. Последующие аргументы и аргументы других типов передаются через стек. Вызываемая функция удаляет аргументы из стека. Если число аргументов переменное, все аргументы помещаются в стек. Атрибут thiscall предназначен для нестатических функций-членов C++. В качестве расширения GCC это соглашение о вызовах можно использовать для функций C и статических методов-членов.

ms_abi
sysv_abi

На 32-разрядных и 64-разрядных целевых платформах x86 можно использовать атрибут ABI, чтобы указать, какое соглашение о вызовах следует использовать для функции. Атрибут ms_abi указывает компилятору использовать ABI Microsoft, а атрибут sysv_abi — использовать ABI System V ELF, применяемый в GNU/Linux и других системах. По умолчанию при компиляции для Windows используется ABI Microsoft. Во всех остальных системах по умолчанию используется ABI System V ELF.

Обратите внимание: атрибут ms_abi для целевых платформ Microsoft Windows 64-bit в настоящее время требует параметра -maccumulate-outgoing-args.

callee_pop_aggregate_return (number)

На целевых платформах x86-32 этот атрибут можно использовать для управления тем, как структуры возвращаются в памяти. Если вызывающая сторона отвечает за удаление из стека скрытого указателя вместе с остальными аргументами, укажите для number значение ноль. Если за удаление скрытого указателя отвечает вызываемая сторона, укажите для number значение один.

В ABI x86-32 по умолчанию предполагается, что вызываемая сторона удаляет из стека скрытый указатель. Однако на целевых платформах x86-32 Microsoft Windows компилятор предполагает, что скрытый указатель удаляет из стека вызывающая сторона.

ms_hook_prologue

На 32-разрядных и 64-разрядных целевых платформах x86 этот атрибут функции можно использовать, чтобы GCC генерировал пролог функции с поддержкой «горячей замены» (hot-patching), используемый в функциях Win32 API в Microsoft Windows XP Service Pack 2 и более новых версиях.

naked

Этот атрибут позволяет компилятору сформировать необходимое объявление функции, оставляя возможность задать тело функции на ассемблере. Для указанной функции компилятор не генерирует последовательности пролога и эпилога. В функции без пролога (naked) безопасно использовать только операторы asm (см. Базовый Asm — инструкции ассемблера без операндов). Хотя использование расширенного asm или сочетания базового asm и кода C может показаться работоспособным, полагаться на его надежную работу нельзя; такой способ не поддерживается.

regparm (number)

На целевых платформах x86-32 атрибут regparm заставляет компилятор передавать первые аргументы с первого по number, если они имеют целочисленный тип, в регистрах EAX, EDX и ECX, а не через стек. Функциям с переменным числом аргументов по-прежнему передаются все аргументы через стек.

Обратите внимание: в некоторых системах ELF этот атрибут не подходит для глобальных функций в разделяемых библиотеках с ленивой привязкой (используемой по умолчанию). При ленивой привязке первый вызов проходит через код разрешения символов в загрузчике, который может предполагать, что содержимое EAX, EDX и ECX можно изменить в соответствии со стандартными соглашениями о вызовах. Это затрагивает Solaris 8. Считается, что системы с GNU C Library версии 2.1 или выше и FreeBSD безопасны, поскольку их загрузчики сохраняют EAX, EDX и ECX. (При необходимости ленивую привязку можно отключить с помощью компоновщика или загрузчика, чтобы избежать этой проблемы.)

sseregparm

На целевых платформах x86-32 с поддержкой SSE атрибут sseregparm заставляет компилятор передавать до трех аргументов с плавающей точкой в регистрах SSE, а не через стек. Функции с переменным числом аргументов по-прежнему передают все аргументы с плавающей точкой через стек.

force_align_arg_pointer

На целевых платформах x86 атрибут force_align_arg_pointer можно применить к отдельным определениям функций, чтобы сгенерировать альтернативные пролог и эпилог, выравнивающие стек во время выполнения при необходимости. Это позволяет сочетать старый код, работающий со стеком, выровненным по 4 байтам, с современным кодом, использующим стек с выравниванием по 16 байтам для совместимости с SSE.

stdcall

На целевых платформах x86-32 атрибут stdcall заставляет компилятор считать, что вызываемая функция удаляет из стека область, использованную для передачи аргументов, если только она не принимает переменное число аргументов.

no_callee_saved_registers

Используйте этот атрибут, чтобы указать, что у заданной функции нет регистров, сохраняемых вызываемой стороной. То есть все регистры можно использовать как временные. Например, этот атрибут можно использовать для функции, вызываемой из ассемблерной заглушки обработчика прерывания, которая сохраняет все регистры и возвращается из прерывания.

no_caller_saved_registers

Используйте этот атрибут, чтобы указать, что у заданной функции нет регистров, сохраняемых вызывающей стороной. То есть все регистры сохраняются вызываемой стороной. Например, этот атрибут можно использовать для функции, вызываемой из обработчика прерывания. Компилятор генерирует необходимые последовательности входа в функцию и выхода из нее для сохранения и восстановления всех измененных регистров, кроме регистра EFLAGS. Поскольку GCC не сохраняет состояния SSE, MMX и x87, для компиляции функций с атрибутом no_caller_saved_registers следует использовать параметр GCC -mgeneral-regs-only.

interrupt

Используйте этот атрибут, чтобы указать, что заданная функция является обработчиком прерывания или обработчиком исключения (в зависимости от переданных функции параметров, о которых говорится далее). При наличии этого атрибута компилятор генерирует последовательности входа в функцию и выхода из нее, подходящие для обработчика прерывания. Для возврата из обработчиков прерываний используется инструкция IRET вместо инструкции RET. Компилятор сохраняет все регистры, кроме регистра EFLAGS, который восстанавливается инструкцией IRET. Поскольку GCC не сохраняет состояния SSE, MMX и x87, для компиляции обработчиков прерываний и исключений следует использовать параметр GCC -mgeneral-regs-only.

Код, который может быть прерван без переключения стека, необходимо компилировать с параметром -mno-red-zone, поскольку из-за особенностей аппаратной архитектуры обработчики прерываний могут обращаться к красной зоне и действительно делают это.

Обработчик прерывания необходимо объявить с обязательным аргументом-указателем:

struct interrupt_frame;

__attribute__ ((interrupt))
void
f (struct interrupt_frame *frame)
{
}

а также определить struct interrupt_frame, как описано в руководстве по процессору.

Обработчики исключений отличаются от обработчиков прерываний тем, что система помещает в стек код ошибки. Объявление обработчика исключения аналогично объявлению обработчика прерывания, но имеет другую обязательную сигнатуру функции. Компилятор обеспечивает удаление кода ошибки из стека перед инструкцией IRET.

#ifdef __x86_64__
typedef unsigned long long int uword_t;
#else
typedef unsigned int uword_t;
#endif

struct interrupt_frame;

__attribute__ ((interrupt))
void
f (struct interrupt_frame *frame, uword_t error_code)
{
  ...
}

Обработчики исключений следует использовать только для исключений, при возникновении которых помещается код ошибки; в остальных случаях следует использовать обработчик прерывания. При использовании обработчика неподходящего типа система аварийно завершит работу.

target (options)

Как обсуждалось в разделе Общие атрибуты функций, этот атрибут позволяет задавать параметры компиляции, специфичные для целевой платформы.

Для x86 разрешены следующие параметры:

‘3dnow’
‘no-3dnow’

Включить или отключить генерацию инструкций 3DNow!.

‘3dnowa’
‘no-3dnowa’

Включить или отключить генерацию расширенных инструкций 3DNow!.

‘abm’
‘no-abm’

Включить или отключить генерацию инструкций расширенной обработки битов.

‘adx’
‘no-adx’

Включить или отключить генерацию инструкций ADX.

‘aes’
‘no-aes’

Включить или отключить генерацию инструкций AES.

‘avx’
‘no-avx’

Включить или отключить генерацию инструкций AVX.

‘avx2’
‘no-avx2’

Включить или отключить генерацию инструкций AVX2.

‘avx512bitalg’
‘no-avx512bitalg’

Включить или отключить генерацию инструкций AVX512BITALG.

‘avx512bw’
‘no-avx512bw’

Включить или отключить генерацию инструкций AVX512BW.

‘avx512cd’
‘no-avx512cd’

Включить или отключить генерацию инструкций AVX512CD.

‘avx512dq’
‘no-avx512dq’

Включить или отключить генерацию инструкций AVX512DQ.

‘avx512er’
‘no-avx512er’

Включить или отключить генерацию инструкций AVX512ER.

‘avx512f’
‘no-avx512f’

Включить или отключить генерацию инструкций AVX512F.

‘avx512ifma’
‘no-avx512ifma’

Включить или отключить генерацию инструкций AVX512IFMA.

‘avx512vbmi’
‘no-avx512vbmi’

Включить или отключить генерацию инструкций AVX512VBMI.

‘avx512vbmi2’
‘no-avx512vbmi2’

Включить или отключить генерацию инструкций AVX512VBMI2.

‘avx512vl’
‘no-avx512vl’

Включить или отключить генерацию инструкций AVX512VL.

‘avx512vnni’
‘no-avx512vnni’

Включить или отключить генерацию инструкций AVX512VNNI.

‘avx512vpopcntdq’
‘no-avx512vpopcntdq’

Включить или отключить генерацию инструкций AVX512VPOPCNTDQ.

‘bmi’
‘no-bmi’

Включить или отключить генерацию инструкций BMI.

‘bmi2’
‘no-bmi2’

Включить или отключить генерацию инструкций BMI2.

‘cldemote’
‘no-cldemote’

Включить или отключить генерацию инструкций CLDEMOTE.

‘clflushopt’
‘no-clflushopt’

Включить или отключить генерацию инструкций CLFLUSHOPT.

‘clwb’
‘no-clwb’

Включить или отключить генерацию инструкций CLWB.

‘clzero’
‘no-clzero’

Включить или отключить генерацию инструкций CLZERO.

‘crc32’
‘no-crc32’

Включить или отключить генерацию инструкций CRC32.

‘cx16’
‘no-cx16’

Включить или отключить генерацию инструкций CMPXCHG16B.

‘default’

См. раздел Многоверсионность функций, где этот параметр используется для указания версии функции по умолчанию.

‘f16c’
‘no-f16c’

Включить или отключить генерацию инструкций F16C.

‘fma’
‘no-fma’

Включить или отключить генерацию инструкций FMA.

‘fma4’
‘no-fma4’

Включить или отключить генерацию инструкций FMA4.

‘fsgsbase’
‘no-fsgsbase’

Включить или отключить генерацию инструкций FSGSBASE.

‘fxsr’
‘no-fxsr’

Включить или отключить генерацию инструкций FXSR.

‘gfni’
‘no-gfni’

Включить или отключить генерацию инструкций GFNI.

‘hle’
‘no-hle’

Включить или отключить генерацию префиксов инструкций HLE.

‘lwp’
‘no-lwp’

Включить или отключить генерацию инструкций LWP.

‘lzcnt’
‘no-lzcnt’

Включить или отключить генерацию инструкций LZCNT.

‘mmx’
‘no-mmx’

Включить или отключить генерацию инструкций MMX.

‘movbe’
‘no-movbe’

Включить или отключить генерацию инструкций MOVBE.

‘movdir64b’
‘no-movdir64b’

Включить или отключить генерацию инструкций MOVDIR64B.

‘movdiri’
‘no-movdiri’

Включить или отключить генерацию инструкций MOVDIRI.

‘mwait’
‘no-mwait’

Включить или отключить генерацию инструкций MWAIT и MONITOR.

‘mwaitx’
‘no-mwaitx’

Включить или отключить генерацию инструкций MWAITX.

‘pclmul’
‘no-pclmul’

Включить или отключить генерацию инструкций PCLMUL.

‘pconfig’
‘no-pconfig’

Включить или отключить генерацию инструкций PCONFIG.

‘pku’
‘no-pku’

Включить или отключить генерацию инструкций PKU.

‘popcnt’
‘no-popcnt’

Включить или отключить генерацию инструкции POPCNT.

‘prfchw’
‘no-prfchw’

Включить или отключить генерацию инструкции PREFETCHW.

‘ptwrite’
‘no-ptwrite’

Включить или отключить генерацию инструкций PTWRITE.

‘rdpid’
‘no-rdpid’

Включить или отключить генерацию инструкций RDPID.

‘rdrnd’
‘no-rdrnd’

Включить или отключить генерацию инструкций RDRND.

‘rdseed’
‘no-rdseed’

Включить или отключить генерацию инструкций RDSEED.

‘rtm’
‘no-rtm’

Включить или отключить генерацию инструкций RTM.

‘sahf’
‘no-sahf’

Включить или отключить генерацию инструкций SAHF.

‘sgx’
‘no-sgx’

Включить или отключить генерацию инструкций SGX.

‘sha’
‘no-sha’

Включить или отключить генерацию инструкций SHA.

‘shstk’
‘no-shstk’

Включить или отключить встроенные функции теневого стека из CET.

‘sse’
‘no-sse’

Включить или отключить генерацию инструкций SSE.

‘sse2’
‘no-sse2’

Включить или отключить генерацию инструкций SSE2.

‘sse3’
‘no-sse3’

Включить или отключить генерацию инструкций SSE3.

‘sse4’
‘no-sse4’

Включить или отключить генерацию инструкций SSE4 (как SSE4.1, так и SSE4.2).

‘sse4.1’
‘no-sse4.1’

Включить или отключить генерацию инструкций SSE4.1.

‘sse4.2’
‘no-sse4.2’

Включить или отключить генерацию инструкций SSE4.2.

‘sse4a’
‘no-sse4a’

Включить или отключить генерацию инструкций SSE4A.

‘ssse3’
‘no-ssse3’

Включить или отключить генерацию инструкций SSSE3.

‘tbm’
‘no-tbm’

Включить или отключить генерацию инструкций TBM.

‘vaes’
‘no-vaes’

Включить или отключить генерацию инструкций VAES.

‘vpclmulqdq’
‘no-vpclmulqdq’

Включить или отключить генерацию инструкций VPCLMULQDQ.

‘waitpkg’
‘no-waitpkg’

Включить или отключить генерацию инструкций WAITPKG.

‘wbnoinvd’
‘no-wbnoinvd’

Включить или отключить генерацию инструкций WBNOINVD.

‘xop’
‘no-xop’

Включить или отключить генерацию инструкций XOP.

‘xsave’
‘no-xsave’

Включить или отключить генерацию инструкций XSAVE.

‘xsavec’
‘no-xsavec’

Включить или отключить генерацию инструкций XSAVEC.

‘xsaveopt’
‘no-xsaveopt’

Включить или отключить генерацию инструкций XSAVEOPT.

‘xsaves’
‘no-xsaves’

Включить или отключить генерацию инструкций XSAVES.

‘amx-tile’
‘no-amx-tile’

Включить или отключить генерацию инструкций AMX-TILE.

‘amx-int8’
‘no-amx-int8’

Включить или отключить генерацию инструкций AMX-INT8.

‘amx-bf16’
‘no-amx-bf16’

Включить или отключить генерацию инструкций AMX-BF16.

‘uintr’
‘no-uintr’

Включить или отключить генерацию инструкций UINTR.

‘hreset’
‘no-hreset’

Включить или отключить генерацию инструкции HRESET.

‘kl’
‘no-kl’

Включить или отключить генерацию инструкций KEYLOCKER.

‘widekl’
‘no-widekl’

Включить или отключить генерацию инструкций WIDEKL.

‘avxvnni’
‘no-avxvnni’

Включить или отключить генерацию инструкций AVXVNNI.

‘avxifma’
‘no-avxifma’

Включить или отключить генерацию инструкций AVXIFMA.

‘avxvnniint8’
‘no-avxvnniint8’

Включить или отключить генерацию инструкций AVXVNNIINT8.

‘avxneconvert’
‘no-avxneconvert’

Включить или отключить генерацию инструкций AVXNECONVERT.

‘cmpccxadd’
‘no-cmpccxadd’

Включить или отключить генерацию инструкций CMPccXADD.

‘amx-fp16’
‘no-amx-fp16’

Включить или отключить генерацию инструкций AMX-FP16.

‘prefetchi’
‘no-prefetchi’

Включить или отключить генерацию инструкций PREFETCHI.

‘raoint’
‘no-raoint’

Включить или отключить генерацию инструкций RAOINT.

‘amx-complex’
‘no-amx-complex’

Включить или отключить генерацию инструкций AMX-COMPLEX.

‘avxvnniint16’
‘no-avxvnniint16’

Включить или отключить генерацию инструкций AVXVNNIINT16.

‘sm3’
‘no-sm3’

Включить или отключить генерацию инструкций SM3.

‘sha512’
‘no-sha512’

Включить или отключить генерацию инструкций SHA512.

‘sm4’
‘no-sm4’

Включить или отключить генерацию инструкций SM4.

‘usermsr’
‘no-usermsr’

Включить или отключить генерацию инструкций USER_MSR.

‘apxf’
‘no-apxf’

Включить или отключить функции APX, включая EGPR, PUSH2POP2, NDD и PPX.

‘avx10.1-256’
‘no-avx10.1-256’

Включить генерацию инструкций AVX10.1 с поддержкой 256 бит. Отключить генерацию инструкций AVX10.1.

‘avx10.1’
‘no-avx10.1’

Включить генерацию инструкций AVX10.1 с поддержкой 512 бит. Отключить генерацию инструкций AVX10.1.

‘avx10.1-512’
‘no-avx10.1-512’

Включить генерацию инструкций AVX10.1 с поддержкой 512 бит. Отключить генерацию инструкций AVX10.1.

‘avx10.2’
‘no-avx10.2’

Включить или отключить генерацию инструкций AVX10.2.

‘amx-avx512’
‘no-amx-avx512’

Включить или отключить генерацию инструкций AMX-AVX512.

‘amx-tf32’
‘no-amx-tf32’

Включить или отключить генерацию инструкций AMX-TF32.

‘amx-transpose’
‘no-amx-transpose’

Включить или отключить генерацию инструкций AMX-TRANSPOSE.

‘amx-fp8’
‘no-amx-fp8’

Включить или отключить генерацию инструкций AMX-FP8.

‘movrs’
‘no-movrs’

Включить или отключить генерацию инструкций MOVRS.

‘amx-movrs’
‘no-amx-movrs’

Включить или отключить генерацию инструкций AMX-MOVRS.

‘cld’
‘no-cld’

Включить или отключить генерацию инструкции CLD перед строковыми операциями перемещения.

‘fancy-math-387’
‘no-fancy-math-387’

Включить или отключить генерацию инструкций sin, cos и sqrt для блока операций с плавающей запятой 387.

‘ieee-fp’
‘no-ieee-fp’

Включить или отключить генерацию операций с плавающей запятой, зависящих от арифметики IEEE.

‘inline-all-stringops’
‘no-inline-all-stringops’

Включить или отключить встраивание строковых операций.

‘inline-stringops-dynamically’
‘no-inline-stringops-dynamically’

Включить или отключить генерацию встроенного кода для небольших строковых операций и вызов библиотечных функций для крупных операций.

‘align-stringops’
‘no-align-stringops’

Выравнивать или не выравнивать место назначения встроенных строковых операций.

‘recip’
‘no-recip’

Включить или отключить генерацию инструкций RCPSS, RCPPS, RSQRTSS и RSQRTPS с последующим дополнительным шагом метода Ньютона — Рафсона вместо выполнения деления с плавающей запятой.

‘general-regs-only’

Генерировать код, использующий только регистры общего назначения.

‘arch=ARCH’

Указать архитектуру, для которой следует генерировать код при компиляции функции.

‘tune=TUNE’

Указать архитектуру, для которой следует настраивать код при компиляции функции.

‘fpmath=FPMATH’

Указать, какой блок операций с плавающей запятой использовать. Параметр target("fpmath=sse,387") необходимо указать как target("fpmath=sse+387"), поскольку запятая разделяет разные параметры.

‘prefer-vector-width=OPT’

На целевых платформах x86 атрибут prefer-vector-width указывает компилятору использовать в инструкциях векторную разрядность OPT вместо разрядности по умолчанию для выбранной платформы.

Допустимые значения OPT:

‘none’

Для GCC не применяются дополнительные ограничения, кроме заданных выбранной платформой.

‘128’

Предпочитать для инструкций векторную разрядность 128 бит.

‘256’

Предпочитать для инструкций векторную разрядность 256 бит.

‘512’

Предпочитать для инструкций векторную разрядность 512 бит.

indirect_branch("choice")

На целевых платформах x86 атрибут indirect_branch заставляет компилятор преобразовывать косвенные вызовы и переходы в соответствии с параметром choice. ‘keep’ оставляет косвенные вызовы и переходы без изменений. ‘thunk’ преобразует косвенные вызовы и переходы в вызовы заглушки с возвратом. ‘thunk-inline’ преобразует косвенные вызовы и переходы во встроенные вызовы заглушки с возвратом. ‘thunk-extern’ преобразует косвенные вызовы и переходы во внешние вызовы заглушки с возвратом, предоставляемые в отдельном объектном файле.

function_return("choice")

На целевых платформах x86 атрибут function_return заставляет компилятор преобразовывать возврат из функции в соответствии с параметром choice. ‘keep’ оставляет возврат из функции без изменений. ‘thunk’ преобразует возврат из функции в вызов заглушки с возвратом. ‘thunk-inline’ преобразует возврат из функции во встроенный вызов заглушки с возвратом. ‘thunk-extern’ преобразует возврат из функции во внешний вызов заглушки с возвратом, предоставляемой в отдельном объектном файле.

nocf_check

Атрибут nocf_check функции сообщает компилятору, что пролог функции не следует инструментировать при компиляции с параметром -fcf-protection=branch. Компилятор предполагает, что адрес функции является допустимой целью передачи управления.

Атрибут nocf_check типа указателя на функцию сообщает компилятору, что вызов через указатель не следует инструментировать при компиляции с параметром -fcf-protection=branch. Компилятор предполагает, что адрес функции, полученный из указателя, является допустимой целью передачи управления. Прямой вызов функции по имени считается безопасным, поэтому компилятор не инструментирует прямые вызовы.

Атрибут nocf_check применяется к типу объекта. При присваивании адреса функции или указателя на функцию другому указателю атрибут не переносится с типа объекта в правой части; тип объекта в левой части не изменяется. Компилятор проверяет несоответствие атрибута nocf_check и выдает предупреждение в случае несовпадения.

{
int foo (void) __attribute__(nocf_check);
void (*foo1)(void) __attribute__(nocf_check);
void (*foo2)(void);

/* foo's address is assumed to be valid.  */
int
foo (void) 

  /* This call site is not checked for control-flow 
     validity.  */
  (*foo1)();

  /* A warning is issued about attribute mismatch.  */
  foo1 = foo2; 

  /* This call site is still not checked.  */
  (*foo1)();

  /* This call site is checked.  */
  (*foo2)();

  /* A warning is issued about attribute mismatch.  */
  foo2 = foo1; 

  /* This call site is still checked.  */
  (*foo2)();

  return 0;
}
cf_check

Атрибут cf_check функции сообщает компилятору, что при включенном параметре -fcf-protection=branch в точке входа функции следует разместить инструкцию ENDBR.

indirect_return

Атрибут indirect_return можно применять к функции, а также к переменной или типу указателя на функцию, чтобы сообщить компилятору, что функция может возвращать управление посредством косвенного перехода.

fentry_name("name")

На целевых платформах x86 атрибут fentry_name задает функцию, вызываемую при входе в функцию, если инструментирование функций включено параметрами -pg -mfentry. Если name имеет значение nop, генерируется последовательность NOP длиной 5 байт.

fentry_section("name")

На целевых платформах x86 атрибут fentry_section задает имя секции для записи вызовов инструментирования входа в функцию, если оно включено параметрами -pg -mrecord-mcount.

nodirect_extern_access

Этот атрибут, применяемый к глобальной переменной или функции, является аналогом параметра -mno-direct-extern-access.

Правила встраивания

В x86 компилятор не встраивает функцию, если ее целевые параметры отличаются от параметров вызывающей функции, за исключением случая, когда параметры вызываемой функции составляют подмножество целевых параметров вызывающей функции. Например, функция, объявленная с атрибутом target("sse3"), может встроить функцию с атрибутом target("sse2"), поскольку -msse3 подразумевает -msse2.

Помимо основного правила, при указании для функции атрибута target("arch=ARCH") или target("tune=TUNE") применяются другие правила встраивания. Они допускают встраивание функции, для которой заданы параметры по умолчанию -march=x86-64 и -mtune=generic, а также функции с подмножеством возможностей ISA, помеченной атрибутом always_inline.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/x86-Function-Attributes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API