Spec-Zone.ru › GCC 15

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

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

Генерирует машинную инструкцию tbegin, запускающую аппаратную транзакцию без ограничений. Если параметр не равен NULL, область памяти используется для хранения диагностического буфера транзакции и передаётся в качестве первого операнда в tbegin. Этот буфер можно определить с помощью структуры C struct __htm_tdb, определённой в 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 руководства Principles of Operation.

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

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

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

В дополнение к __builtin_tbegin генерируется цикл для обработки временных сбоев. Если tbegin возвращает код условия 2, транзакция будет повторяться указанное во втором аргументе число раз. Чтобы сообщить ЦП о числе уже произошедших сбоев, используется инструкция perform processor assist.

Встроенная функция: 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, а в 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-15.3.0/gcc/S_002f390-System-z-Built_002din-Functions.html

Spec-Zone.ru

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