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