PowerPC E500 / P1020 . Считать 64-битные (2х32-битные регистры) атомарным способом

Я только начал работать с P1020 PowerPC IC, и у меня возникла первая проблема. Я искал справочное руководство по P1020 и документацию по e500 ppc и не могу найти ответ на свой вопрос.

Как я могу прочитать 64-битное значение - созданное как два 32-битных нижних регистра TBL и 32-битных старших TBU модуля Time Base - и предотвратить состояние гонки? Гарантируется ли, что значение будет правильным (регистры заблокированы?). Есть ли какая-нибудь инструкция на ассемблере, которая может прочитать оба регистра атомарным способом? Где я могу найти такую ​​информацию в документе? Спасибо

1 ответ

Решение

В документе по архитектуре PowerPC есть специальный раздел, посвященный именно этому - см. Раздел 2.2.1.2 "Чтение временной базы в 32-разрядном режиме" (на странице 60) https://wiki.alcf.anl.gov/images/f/fb/PowerPC_-_Assembly_-_IBM_Programming_Environment_2.3.pdf.

Вкратце: вы хотите прочитать верхнюю часть временной шкалы, затем нижнюю, затем снова верхнюю и сравнить два чтения верхней. Если они не равны, то ваши чтения охватывают перенос, поэтому выполните все три чтения снова.

Как документ описывает в сборке:

loop:
    mftbu   rx      # load from TBU
    mftb    ry      # load from TBL
    mftbu   rz      # load from TBU
    cmpw    rz, rx  # see if ‘old’ = ‘new’
    bne     loop    # loop if carry occurred
Другие вопросы по тегам