Регистры генератора адресов данных DAG2 являются 32-х разрядными и способны адресовать тот же объем памяти, что и DAG1. Однако, инструкции по-прежнему должны выбираться из младших 224 ячеек памяти.
Основными дополнительными возможностями DAG во втором поколении SHARC-процессоров являются:
- глобальное разрешение/запрещение круговых буферов (бит CBUFEN в регистре MODE1);
- поддержка режима широковещательной загрузки регистров данных;
- функционирование в SIMD-режиме.
Широковещательный режим загрузки Broadcast Load (вне зависимости от SISD/SIMD-режима) данных предполагает запись одного и того же слова одновременно и в указанный регистр, и в его дополнение в другом процессорном элементе (включается/выключается битами BDCST1 и BDCST9) при использовании косвенной адресации с индексными регистрами I1 и I9 (рис.6). Например, инструкция:
R1 = dm(I1, M0);
приведет к записи одного и того же значения и в регистр R1, и в регистр S1.
Рис.6. Доступ к пространствам нормальных и длинных слов в режиме Broadcast Load
Следует проявлять осторожность при использовании круговых буферов в SIMD-режиме. Понятно, что его длина должна быть обязательно четной, а инкрементацию адреса (значение M-регистра) желательно выбирать равной 2, чтобы обеспечить правильное последовательное считывание/запись значений памяти.
|
|
При обмене данными между регистрами DAG и памятью (т.е. при чтении в регистры DAG значений непосредственно из памяти или наоборот), также может возникнуть желание выполнять за один такт не одну, а две пересылки данных по 64-разрядной шине данных. Это возможно при чтении/записи пространства длинных слов (или пространства нормальных слов с модификатором LW). При этом, как всегда при 64-разрядной передаче данных, выполняются явная и неявная пересылки:
- если в инструкции в качестве приемника/источника указан четный DAG-регистр, то он используется в явной пересылке (его "данные" пересылаются по младшим 32 битам шины), а регистр с номером на 1 больше – в неявной пересылке (его "данные" пересылаются по старшим 32 битам шины), например:
I2 = dm(buffer) (LW); { I2 = dm(buffer), I3 = dm(buffer+1) }
- если в инструкции в качестве приемника/источника указан нечетный DAG-регистр, то он используется в явной пересылке (его "данные" пересылаются по младшим 32 битам шины), а регистр с номером на 1 меньше – в неявной пересылке (его "данные" пересылаются по старшим 32 битам шины), например:
I1 = dm(0x28000) (LW); { I1 = dm(buffer), I0 = dm(buffer+1) }
При этом, если используется косвенная адресация, то индексный регистр модифицируется не более одного раза!
I9 = dm(I1,M1) (LW); { I9 = dm(I1), I8 = dm(I1+1), I1 = I1 + M1 }
В случае, если выполняется пересылка данных из пространства длинных слов, то регистры регистрового файла рассматриваются как парные: R0-R1, R2-R3,..., R14-R15. При выполнении пересылки из памяти в R0 (или наоборот) или другой "четный" регистр, следующее слово данных записывается в R1:
|
|
R0 = dm(I1,M1); {если I1 указывает на адрес в Long Word, то R0 = dm(I1), R1=dm(I1+1) }
Если в инструкции в качестве приемника/источника указан R1 или другой "нечетный" регистр, то следующее слово данных будет записано/прочитано в/из парный ему регистр R0:
R1 = dm(I1,M1); {если I1 указывает на адрес в Long Word, то R1 = dm(I1), R0=dm(I1+1) }