Spec-Zone.ru › GCC 14

6.62.35 S/390 System z Встроенные функции

Встроенная функция: int __builtin_tbegin (void*)

Генерирует инструкцию tbegin машины, начинающую не ограниченную аппаратную транзакцию. Если параметр не NULL, область памяти используется для хранения буфера диагностики транзакции и будет передана в качестве первого операнда функции tbegin. Этот буфер может быть определен с помощью структуры struct __htm_tdb языка C, определенной в htmintrin.h, и должен располагаться на границе двойного слова. Второй операнд tbegin устанавливается в 0xff0c. Это позволяет сохранять/восстанавливать все регистры общего назначения (GPR) и отключает прерывания по ошибкам для манипуляций с регистрами плавающей запятой (FPR) и регистрами доступа (AR) внутри тела транзакции. Код условия, установленный инструкцией tbegin, возвращается как целое значение. Инструкция tbegin по определению перезаписывает содержимое всех регистров FPR. Компилятор сгенерирует код, который сохраняет и восстанавливает регистры FPR. Для кода с плавающей запятой рекомендуется использовать вариант *_nofloat. Для предотвращения записи TDB требуется передать постоянное значение нуль в качестве параметра. Передача нулевого значения через переменную недостаточно. Хотя изменения регистров доступа внутри транзакции не приведут к прерыванию транзакции, их фактическое изменение не поддерживается. Регистры доступа не сохраняются при входе в транзакцию. Они будут иметь неопределенное состояние при достижении кода прерывания.

Макросы для возможных кодов возврата tbegin определены в файле заголовков htmintrin.h:

Макрос: _HTM_TBEGIN_STARTED

tbegin был выполнен как часть обычной обработки. Тело транзакции должно быть выполнено.

Макрос: _HTM_TBEGIN_INDETERMINATE

Транзакция была прервана из-за неопределенного условия, которое может быть постоянным.

Макрос: _HTM_TBEGIN_TRANSIENT

Транзакция прервана из-за временного сбоя. В этом случае транзакция должна быть повторно выполнена.

Макрос: _HTM_TBEGIN_PERSISTENT

Транзакция прервана из-за постоянного сбоя. Повторное выполнение в тех же условиях не будет продуктивным.

Макрос: _HTM_FIRST_USER_ABORT_CODE

_HTM_FIRST_USER_ABORT_CODE определённый в htmintrin.h задаёт первый код прерывания, который может быть использован для __builtin_tabort. Значения ниже этого порога зарезервированы для использования машиной.

Тип данных: struct __htm_tdb

struct __htm_tdb определенный в htmintrin.h описывает структуру блока диагностики транзакции, как указано в главе 5-91 руководства по принципам работы.

Встроенная функция: int __builtin_tbegin_nofloat (void*)

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

Встроенная функция: int __builtin_tbegin_retry (void*, int)

В дополнение к __builtin_tbegin генерируется цикл для временных сбоев. Если tbegin возвращает код условия 2, транзакция будет повторно выполняться столько раз, сколько указано во втором аргументе. Инструкция выполнения процессорной помощи используется для уведомления процессора о количестве неудачных попыток до сих пор.

Встроенная функция: int __builtin_tbegin_retry_nofloat (void*, int)

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

Встроенная функция: void __builtin_tbeginc (void)

Генерирует инструкцию tbeginc машины, начинающую ограниченную аппаратную транзакцию. Второй операнд устанавливается в 0xff08.

Встроенная функция: int __builtin_tend (void)

Генерирует инструкцию tend машины, завершающую транзакцию и делающую изменения видимыми для других потоков. Код условия, сгенерированный инструкцией tend, возвращается как целое значение.

Встроенная функция: void __builtin_tabort (int)

Генерирует инструкцию tabort машины со специфицированным кодом прерывания. Коды прерывания от 0 до 255 зарезервированы и приведут к сообщению об ошибке.

Встроенная функция: void __builtin_tx_assist (int)

Генерирует инструкцию ppa rX,rY,1 машины. Где целое значение загружается в rX, а значение 0 - в rY. Целое значение задаёт количество повторных прерываний транзакции.

Встроенная функция: int __builtin_tx_nesting_depth (void)

Генерирует инструкцию etnd машины. Текущая глубина вложенности возвращается как целое значение. Для глубины вложенности 0 код не выполняется как часть транзакции.

Встроенная функция: void __builtin_non_tx_store (uint64_t *, uint64_t)

Генерирует инструкцию ntstg машины. Второй аргумент записывается в местоположение первого аргумента. Операция записи не будет отменена в случае прерывания транзакции.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/S_002f390-System-z-Built_002din-Functions.html

Spec-Zone.ru

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