7.13.34 Встроенные функции S/390 System z
-
Встроенная функция:
int__builtin_tbegin(void*) Генерирует машинную инструкцию
tbegin, запускающую аппаратную транзакцию без ограничений. Если параметр не равен NULL, область памяти используется для хранения диагностического буфера транзакции и передаётся в качестве первого операнда вtbegin. Этот буфер можно определить с помощью структуры Cstruct __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