Адресация регистров в устройстве обработки данных

 

Изобретение относится к адресации регистров в устройстве обработки данных и может быть использовано для цифровой обработки сигналов. Техническим результатом является возможность применения команды переопределения только для заранее выбранного количества команд. Устройство обработки данных содержит множество регистров для хранения элементов данных, процессор для обработки команд, блок переопределения регистров для преобразования ссылки на логический регистр в предварительно выбранном наборе команд в ссылку на физический регистр и аппаратное средство осуществления циклов для управления командой повторения. 2 с. и 20 з.п.ф-лы, 7 ил., 60 табл.

Настоящее изобретение относится к адресации регистров в устройстве обработки данных и особенно уместно в области цифровой обработки сигнала, хотя его использование цифровой обработкой сигнала не ограничивается.

В типичном случае устройство обработки данных, такое как микропроцессор, устроено таким образом, чтобы применять принятые команды к элементам данных, считанным из памяти. Для обработки команд микропроцессор снабжен ядром процессора, также, в общем случае, микропроцессор будет иметь множество регистров, в которые предварительно, перед тем, как они потребуются ядру процессора, загружаются элементы данных. По мере того, как микропроцессором принимаются команды, перед поступлением в ядро процессора для обработки, они в типичном случае будут проходить через дешифратор команд. Ядро процессора затем будет применять расшифрованную команду к соответствующему элементу данных, считанному из его регистров. Результат обработанной команды может затем быть записан обратно в один из регистров или направлен непосредственно в память, такую как кэш-память (кэш).

В устройстве обработки данных частым случаем является то, что определенный элемент данных требуется для ряда команд. Следовательно, этот элемент данных должен быть сохранен в одном из регистров до тех пор, пока не будут обработаны все такие команды, и эти команды все должны ссылаться на конкретный регистр, в котором расположен этот элемент данных. Кроме того, обычным является повторение диапазона команд (далее именуемого, как цикл команд) некоторое количество раз, а также повторное использование отдельных элементов данных различными командами внутри цикла команд. В частности, обычным в устройстве цифровой обработки сигнала, является то, что алгоритмы, такие как алгоритм фильтра блока, содержат цикл команд, который требуется повторить некоторое количество раз для того, чтобы применить его к набору элементов данных. Любой конкретный элемент данных может быть использован некоторое количество раз различными командами в цикле команд.

Циклы команд широко используются в относительно сложных арифметических и логических операциях, которые требуется выполнить устройству цифровой обработки сигнала над часто большими объемами данных для создания выходного потока данных в реальном времени. Типичные области применения технологии цифровой обработки сигнала включают мобильные телефоны, в которых требуется выполнить в реальном времени преобразование между аналоговыми аудиосигналами и кодированными цифровыми данными, предназначенными для передачи.

Команда будет в типичном случае включать один или несколько операндов, идентифицирующих регистры, содержащие требуемые командой элементы данных. Например, типичная команда может включать два операнда-источника и один операнд-приемник, идентифицирующие два элемента данных, требуемых командой, и регистр, в который должен быть помещен ее результат. В ситуациях, когда команда является частью цикла команд, который должен быть неоднократно применен к набору элементов данных, как было рассмотрено выше, необходимо, чтобы каждый операнд команды ссылался на соответствующий регистр каждый раз при ее выполнении. Это требование часто означает, что для ссылки каждый раз на разные регистры, одна и та же команда должна быть несколько раз воспроизведена в программном коде цикла команд. Например, если в регистры загружены четыре элемента данных и команда, как часть цикла команд, должна быть применена к каждому из этих четырех элементов данных, то эта команда должна быть воспроизведена четыре раза в цикле команд, причем операнд команды каждый раз будет ссылаться на другой регистр. Очевидно, что это отрицательно влияет на плотность кода.

При разработке микропроцессоров, в определенных ситуациях, как известно, используется концепция ссылок на логические регистры, которые затем соответствующим образом отображаются в ссылки на реальные физические регистры. Например, суперскалярные процессоры часто используют переименование регистров, чтобы сделать возможным гипотетическое и нестандартное выполнение команд. Процессор имеет больше регистров, чем предоставляет модель программиста, и для отображения логических регистров в их текущие физические эквиваленты применяется таблица отображения. Когда процессор выполняет команды гипотетически, для размещения результатов он назначает номера физических регистров. Другие команды также гипотетически могут считать эти результаты. Таким образом, параллельно могут выполняться несколько возможных командных "потоков". В некоторой точке процессор определит, какой из многочисленных потоков является корректным, обычно основываясь на результате условного перехода. В этой точке таблица отображения постоянно обновляется, и некорректные версии любых регистров отбрасываются. Целью этого переименования регистров является увеличение количества исполняемых команд при совершенной прозрачности для программиста. Далее будет очевидно, что это не помогает решить вышеупомянутую проблему плотности кода.

Другим примером использования ссылок на логические и физические регистры является микропроцессор Аm29200 фирмы Advanced Micro Devices (AMD), включающий 192 регистра общего назначения. 128 из них обозначены как локальные регистры, а дополнительный регистр обозначен как указатель стека локальных регистров, при этом регистр-указатель стека обеспечивает смещение в 128 локальных регистрах. Следовательно, всякий раз, когда любая команда ссылается на локальный регистр, она использует значение регистра-указателя стека для вычисления абсолютного номера регистра. Таким образом, если, например, команда хочет обратиться к локальному регистру 1 (последовательность локальных регистров начинается с локального регистра 0), а указатель стека указывает на абсолютный номер регистра 131 (в действительности, это 4-й регистр в последовательности из 128 локальных регистров согласно структуре Аm29200), на самом деле команда получит доступ к регистру, идентифицированному абсолютным номером регистра 132.

В микропроцессоре Аm29200 может быть выполнена команда, которая меняет значение регистра-указателя стека и после которой для любых команд, ссылающихся на локальные регистры, будет использоваться пересмотренное значение в регистре-указателе стека. Это отображение регистра, запрашиваемого командой, в абсолютный номер регистра в 128 локальных регистрах будет применяться для каждой последующей команды до тех пор, пока не будет выполнена другая команда, меняющая регистр-указатель стека.

Следовательно, можно видеть, что приведенная выше структура AMD допускает некоторую степень переопределения в случаях, когда требуется повторение команд для ряда различных элементов данных в различных регистрах. Однако она требует подачи отдельной команды для изменения значения регистра-указателя стека каждый раз, когда регистр, идентифицированный в операнде команды, должен быть отображен в другой локальный регистр. Это вызывает значительное увеличение непроизводительных операций в определенных ситуациях, например, когда цикл команд должен быть повторен некоторое число раз для смещенного набора элементов данных, например такого, который является типичным в устройстве цифровой обработки сигналов. Увеличение непроизводительных операций становится особенно неприемлемым в том случае, когда цикл содержит лишь небольшое число команд, так как перед повторением цикла требуется отдельная команда для изменения значения регистра-указателя стека. Следовательно, например, если одиночную команду требуется повторить десять раз для применения ее к элементам данных от 1 до 10, то перед каждым выполнением команды потребуется отдельная команда для изменения значения в регистре-указателе стека. Следовательно, цикл команд, содержащий одну команду, в результате становится циклом, имеющим две команды, и очевидно, что это добавляет большой объем непроизводительных операций при выполнении цикла команд.

Европейская патентная заявка ЕР-А-0696772 относится к технологии управления массивом регистров, который обеспечивает временное хранение операндов для доступа при помощи команд, выполняемых арифметико-логическим устройством в рамках определенной задачи или контекста. Массив регистров включает механизм обозначения первого набора регистров, начинающегося с первого базового адреса, и второго набора регистров, начинающегося со второго базового адреса. Затем обеспечивается механизм адресации, который считывает из команды относительный адрес, определяет, указывает ли этот относительный адрес на регистр из первого набора регистров или на регистр из второго набора и вычисляет из относительного адреса абсолютный адрес регистра, к которому должна производиться адресация.

Первым объектом настоящего изобретения является устройство обработки данных, содержащее: множество регистров для хранения элементов данных, которые должны быть обработаны; процессор для обработки команд, которые должны быть применены к элементам данных, хранящимся в упомянутом множестве регистров; блок переопределения регистров для преобразования ссылки на логический регистр в предварительно выбранном наборе команд в ссылку на физический регистр, идентифицирующую регистр, содержащий элемент данных, который требуется обработать упомянутым процессором; и аппаратное средство осуществления циклов для управления командой повторения, причем команда повторения определяет диапазон команд, которые необходимо повторить, и упомянутый диапазон команд содержит упомянутый предварительно выбранный набор команд; при этом аппаратное средство осуществления циклов выполнено с возможностью периодического обновления логики переопределения регистров для изменения преобразования ссылки на логический регистр в ссылку на физический регистр, применяемого блоком переопределения регистров.

Согласно изобретению блок переопределения регистров предназначен для выполнения переопределения регистров для предварительно выбранного набора команд. Предпочтительно, блок переопределения регистров выполнен с возможностью конфигурирования командой переопределения, которая выполняется перед упомянутым предварительно выбранным набором команд. Команда переопределения может непосредственно идентифицировать предварительно выбранный набор команд, для которого должно быть выполнено переопределение регистров. В предпочтительных вариантах блок переопределения регистров, конфигурированный командой переопределения, может бы быть запущен в некоторой более поздней точке конкретным событием, таким как начало цикла команд. В таких случаях, предварительно выбранный набор команд, по отношению к которому должно быть выполнено переопределение регистров, должен определяться из конкретной ситуации, например, предварительно выбранный набор может представлять собой все команды в цикле команд.

При таком подходе команду переопределения необходимо выполнить только один раз для того, чтобы переопределение было применено к желаемому набору команд. В этом состоит отличие от структуры микропроцессора AMD, где после изменения командой значения в регистре-указателе стека, то же самое переопределение будет применено ко всем последующим командам, ссылающимся на локальные регистры, и необходимо выполнить другую команду, если значение указателя стека, и, следовательно, переопределение должно быть снова изменено.

В предпочтительных вариантах реализации изобретения аппаратное средство осуществления циклов может быть выполнено с возможностью обновления данных блока переопределения регистров каждый раз, когда повторяется диапазон команд, чтобы отличающееся переопределение из ссылок на логические регистры в ссылки на физические регистры производилось каждый раз, когда повторяется диапазон команд.

В предпочтительных вариантах реализации изобретения команда повторения включает один или несколько параметров переопределения, используемых для конфигурирования блока переопределения регистров. Предпочтительно, чтобы эти параметры переопределения были такими, чтобы переопределение ссылок на логические регистры в ссылки на физические регистры зависело от конкретной итерации диапазона команд, определенного командой повторения. В этом случае, переопределение, выполняемое блоком переопределения регистров, будет изменяться каждый раз, когда повторяется диапазон команд, без необходимости подачи отдельной команды переопределения. Для небольших циклов команд, это может привести к существенному повышению производительности, так как, если вернуться к приведенному выше примеру цикла команд, включающего одну команду, каждая итерация цикла требует выполнения только одной команды, а не двух, как потребовалось бы при использовании известного в данной области подхода, которому соответствует микропроцессор AMD.

Если команда повторения включает один или более параметров переопределения, как указано выше, то может быть предусмотрена команда переопределения, предназначенная для выполнения перед выполнением команды повторения, чтобы конфигурировать блок переопределения регистров с использованием упомянутых одного или более параметров переопределения, при этом команда переопределения не должна быть включена в упомянутый диапазон команд, определяемый командой повторения. При таком подходе команду переопределения требуется исполнить один раз перед выполнением команды повторения. Блок переопределения регистров, определенный командой переопределения, затем будет активизироваться аппаратным средством осуществления циклов при выполнении команды повторения.

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

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

Предпочтительно, в качестве значения смещения, которое должно быть добавлено к ссылке на логический регистр блоком переопределения регистров, используется указатель базы, а команда повторения включает второй параметр переопределения, идентифицирующий значение, на которое увеличивается указатель базы в предварительно определенных интервалах, например, каждый раз, когда повторяется диапазон команд. Следовательно, этот второй параметр переопределения в команде повторения может использоваться для автоматического изменения в предварительно определенных интервалах, например, при каждой итерации цикла команд, способа отображения ссылок на логические регистры в ссылки на физические регистры блоком переопределения регистров. Предпочтительно, команда повторения также включает третий параметр переопределения, предоставляющий первое значение циклического возврата, и, если в процессе приращения указателя стека он становится равным или превышает первое значение циклического возврата, то приращение указателя стека циклически возвращается к новому значению смещения. Это позволяет сформировать периодическую модель указателей базы.

Команда повторения может включать четвертый параметр переопределения, предоставляющий второе значение циклического возврата, и если ссылка на регистр, образованная сложением указателя базы и ссылки на логический регистр, становится равной или превышает второе значение циклического возврата, тогда эта ссылка на регистр циклически возвращается к новой ссылке на регистр. Это второе значение циклического возврата может быть выбрано равным первому параметру переопределения, идентифицирующему количество регистров, которые должны быть переопределены, но может иметь и другое значение. Это второе значение циклического возврата может быть использовано для ограничения блока переопределения регистров желаемым числом регистров.

Множество регистров может быть организовано любым подходящим образом, предпочтительно содержит банки регистров, при этом блок переопределения регистров выполнен с возможностью переопределения для некоторого количества регистров в отдельном банке. Следовательно, элементы данных могут храниться в одном банке регистров, в то время как, например, коэффициенты могут храниться в другом банке регистров.

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

В типичном случае команда может включать множество операндов, причем каждый операнд содержит ссылку на логический регистр, и в таких случаях блок переопределения регистров может быть организован таким образом, чтобы выполнять независимое переопределение для каждого операнда.

Как упоминалось ранее, устройство обработки данных может быть любым устройством, используемым, чтобы обрабатывать данные, но в предпочтительных вариантах оно представляет собой устройство цифровой обработки сигнала. Цифровая обработка сигнала предусматривает использование циклов команд, что обеспечивает преимущества от использования настоящего изобретения, так как для таких циклов команд плотность кода и производительность могут быть значительно увеличены.

Другим объектом настоящего изобретения является способ работы устройства обработки данных, включающий этапы: хранения в множестве регистров элементов данных, которые должны быть обработаны; извлечения из множества регистров одного или более элементов данных, требуемых для обработки команды, включая, если команда является одной из предварительно выбранного набора команд, применение блока переопределения регистров для преобразования ссылки на логический регистр в упомянутой команде в ссылку на физический регистр, идентифицирующую регистр, содержащий элемент данных, требуемый для обработки упомянутой команды; обработки команды с использованием упомянутых одного или более извлеченных элементов; и использования аппаратного средства осуществления циклов для управления командой повторения, определяющей диапазон команд, которые необходимо повторить, причем упомянутый диапазон команд включает упомянутый предварительно выбранный набор команд, при этом упомянутое аппаратное средство осуществления циклов выполнено с возможностью периодического обновления упомянутого блока переопределения регистров для изменения преобразования ссылки на логический регистр в ссылку на физический регистр, применяемого блоком переопределения регистров.

Далее, только в качестве примера реализации изобретения, описан вариант изобретения со ссылками на чертежи, на которых представлено следующее: фиг. 1 изображает общую структурную схему устройства цифровой обработки сигнала; фиг.2 изображает входной буфер для структуры регистров сопроцессора; фиг.3 показывает магистраль данных через сопроцессор; фиг.4 изображает схему мультиплексирования для чтения битов старшего или младшего порядка из регистра; фиг. 5 представляет собой блок-схему, иллюстрирующую логику переопределения регистров, используемую сопроцессором в предпочтительных вариантах реализации изобретения; фиг. 6 более подробно изображает логику переопределения регистров, показанную на фиг.5; фиг.7 представляет собой таблицу, иллюстрирующую алгоритм фильтра блока.

Описанная ниже система имеет отношение к цифровой обработке сигнала (ЦОС). ЦОС может принимать разные формы, но в типичном случае может рассматриваться как процесс, требующий высокоскоростной (в реальном времени) обработки больших объемов данных. Эти данные обычно представляют собой некоторый аналоговый физический сигнал. Подходящим примером ЦОС является обработка, используемая в цифровых мобильных телефонах, в которых принимаются и передаются радиосигналы, что требует декодирования и кодирования (в типичном случае с применением операций свертки, преобразования и корреляции) в аналоговый звуковой сигнал и из него. Другой пример - контроллеры дисковых устройств, в которых сигналы, полученные от головок устройства, обрабатываются для управления перемещением головки.

С учетом вышесказанного, далее следует описание системы цифровой обработки сигнала, основанной на использовании ядра процессора (в данном случае - ядро ARM из семейства микропроцессоров, разработанных фирмой Advanced RISC Machines Limited, Кембридж, Великобритания) работающего во взаимодействии с сопроцессором. Интерфейс микропроцессора и сопроцессора, а также сама архитектура сопроцессора имеют специальную конфигурацию, обеспечивающую функциональные возможности ЦОС. При дальнейших ссылках в тексте ядро микропроцессора будет именоваться ARM, а сопроцессор - Piccolo. ARM и Piccolo будут в типичном случае изготавливаться как единая интегральная схема, которая часто включает другие элементы (например, встроенные динамическое оперативное запоминающее устройство ОЗУ, постоянное запоминающее устройство ПЗУ, цифроаналоговые и аналого-цифровые преобразователи и т.д.) как часть проблемно-ориентированной интегральной микросхемы.

Piccolo представляет собой сопроцессор ARM и, таким образом, выполняет часть команд из набора команд ARM. Команды ARM для сопроцессора позволяют ARM пересылать данные между Piccolo и памятью (с использованием команд "Загрузка сопроцессора", LDC и "Сохранение сопроцессора", STC), и пересылать регистры в Piccolo и из него (с использованием команд "Пересылка в сопроцессор", MCR и "Пересылка из сопроцессора", MRC). Синергетическое взаимодействие ARM и Piccolo можно представить следующим образом: ARM действует как мощный генератор адресов для данных Piccolo, при этом Piccolo остается свободным для выполнения операций ЦОС, требующих работы в реальном времени с большими объемами данных для получения также в реальном времени соответствующих результатов.

На фиг. 1 показаны ARM 2 и Piccolo 4. ARM 2 выдает управляющие сигналы Piccolo 4 для управления пересылкой слов данных в Piccolo 4 и из него. Кэш 6 команд хранит командные слова программы Piccolo, которые необходимы Piccolo 4. В единой памяти 8 на основе динамического ОЗУ хранятся все данные и командные слова, необходимые как ARM 2, так и Piccolo 4. ARM 2 ответственен за адресацию памяти 8 и управление всеми операциями пересылки данных. Конструкция с только одной единой памятью 8 и одним набором шин данных и адресов является менее сложной и дорогостоящей, чем типичный подход к ЦОС, который требует нескольких элементов памяти и шин с большой шириной полосы.

Piccolo исполняет второй командный поток (командные слова программы цифровой обработки сигнала) из кэша 6 команд, который контролирует магистраль данных для Piccolo. Эти команды содержат операции, относящиеся по типу к цифровой обработке сигнала, например, "Умножение с накоплением", и команды управления потоком, например команды цикла с нулевыми непроизводительными затратами. Эти команды применяются к данным, которые содержатся в регистрах 10 Piccolo (см. фиг.2). Эти данные ранее были пересланы ARM 2 из памяти 8. Командный поток поступает из кэша 6 команд; кэш 6 управляет шиной данных как полноправный контроллер шины. Небольшой кэш команд Piccolo будет представлять собой 4-строковый, с 16 словами в строке кэш с непосредственным отображением (64 команды). Для некоторых разработок может иметь смысл сделать кэш команд больше.

Таким образом, две задачи выполняются независимо - ARM загружает данные, a Piccolo их обрабатывает. Это позволяет осуществить непрерывную обработку 16-битовых данных в едином цикле. Piccolo имеет механизм ввода данных (показанный на фиг. 1), который позволяет ARM 2 производить предварительную выборку последовательных данных, загружая данные перед тем, как они потребуются Piccolo. Piccolo может обращаться к загруженным данным в любом порядке, автоматически пополняя свой регистр в то время, как старые данные используются в последний раз (все команды имеют по одному биту на операнд - источник для указания на то, что регистр-источник должен быть пополнен). Этот механизм ввода называется буфером переупорядочивания и включает входной буфер 12. Каждое значение, загруженное в Piccolo (посредством LDC или MCR, см. ниже), несет с собой признак Rn, указывающий на то, какому регистру предназначены данные). Признак Rn хранится рядом со словом данных во входном буфере. Когда к регистру происходит обращение через схему выбора регистра 14, а команда указывает, что регистр данных должен быть пополнен, регистр маркируется как пустой установлением сигнала Е. Регистр затем автоматически пополняется при помощи схемы 16 управления пополнением, используя самое старое загруженное значение, предназначенное для этого регистра во входном буфере 12. Буфер переупорядочивания содержит 8 значений с признаком. Буфер 12 переупорядочивания имеет форму, подобную FIFO (память обратного магазинного типа), за исключением того, что слова данных могут быть извлечены из центра очереди, после чего позднее сохраненные слова будут передвинуты вдоль него, чтобы заполнить пространство. Соответственно, слова данных, наиболее удаленные от входа, являются самыми старыми, и это может быть использовано для решения, какое слово данных должно быть использовано для пополнения регистра, когда входной буфер 12 содержит два слова данных с корректным признаком Rn.

Piccolo выдает данные путем размещения их на хранение в выходном буфере 18 (FIFO), как показано на фиг.3. Данные записываются в FIFO последовательно и считываются ARM в память 8 в том же порядке. Буфер 18 вывода содержит 8 32-битовых значений.

Piccolo связывается с ARM через сопроцессорный интерфейс (сигналы Управление СП на фиг.1). При выполнении команды ARM для сопроцессора, Piccolo может либо выполнить команду, заставляя ARM ожидать до тех пор, пока Piccolo не будет готов перед тем, как выполнить команду, либо отказаться от выполнения. В последнем случае ARM получит исключительную ситуацию "неопределенная команда".

Самые обычные команды для сопроцессора, которые будет выполнять Piccolo - LDC и STC, которые соответственно загружают из памяти 8 и сохраняют в ней слова данных при помощи шины данных, причем все адреса вырабатывает ARM. Именно эти команды загружают данные в буфер переупорядочивания и сохраняют данные из выходного буфера 18. Piccolo будет останавливать ARM на команде LDC, если во входном буфере переупорядочивания недостаточно пространства для загрузки данных, и на STC - если в буфере 18 вывода недостаточно данных для сохранения, т.е. данные, которые ожидает ARM, не находятся в выходном буфере 18. Piccolo также исполняет регистровые пересылки АРМ/Сопроцессор, чтобы предоставить ARM доступ к специальным регистрам Piccolo.

Piccolo производит выборку своих собственных команд из памяти для управления магистралью данных Piccolo, показанной на фиг.3, и пересылки данных из буфера переупорядочивания в регистры и из регистров в выходной буфер 18. Арифметико-логическое устройство Piccolo, которое выполняет эти команды, имеет схему умножителя сумматора 20, которая производит умножение, сложение, вычитание, умножение с накоплением, логические операции, сдвиг и циклический сдвиг. На магистрали данных также имеется схема 22 накопления/сброса и схема 24 масштабирования/насыщения.

Команды Piccolo первоначально загружаются из памяти в кэш 6 команд, где Piccolo может к ним обращаться, при этом ему не требуется доступ обратно в основную память.

Piccolo не может восстанавливаться при отказах памяти. Таким образом, если Piccolo используется в системе виртуальной памяти, все его данные должны располагаться в физической памяти на протяжении всего времени выполнения им задачи. Это незначительное ограничение возникло в связи с тем, что задачи Piccolo по своей природе являются задачами реального времени, например ЦОС в реальном времени. Если произойдет отказ памяти, Piccolo прекратит работу и установит флаг в регистре состояния S2.

На фиг.3 показана общая функциональная схема магистрали данных Piccolo. Банк 10 регистров использует три порта чтения и два порта записи. Один порт записи (порт L) используется для пополнения регистров из буфера переупорядочивания. Выходной буфер 18 обновляется непосредственно от шины 26 результатов арифметико-логического устройства (АЛУ), а выводом из буфера 18 программно управляет ARM. Сопроцессорный интерфейс ARM помещает результаты выполнения команд LDC (Загрузка сопроцессора) в буфер переупорядочивания, а исходные данные команд STC (Сохранение сопроцессора) берет из буфера 18 вывода, а также применяет команды MCR и MRC (Пересылка регистра ARM в регистр СП и из него) к банку 10 регистров.

Остающиеся порты регистров используются для АЛУ. Два порта чтения (А и В) направляют входные данные в схему 20 умножителя/сумматора, порт чтения С используется для направления ввода в схему 22 накопления/сброса. Оставшийся порт записи W используется для возврата результатов в банк 10 регистров.

Умножитель 20 выполняет 16х16 умножение со знаком или без знака, с возможным 48-битовым накоплением. Блок 24 масштабирования может обеспечивать непосредственный арифметический или логический сдвиг вправо от 0 до 31, с возможным последующим насыщением. Сдвиговый и логический блок 20 может за каждый такт выполнять либо сдвиг, либо логическую операцию.

Piccolo имеет 16 регистров общего назначения, названных D0-D15 или А0-А3, Х0-Х3, Y0-Y3, Z0-Z3. Первые четыре регистра (А0-А3) предназначены для использования в качестве аккумуляторов и имеют разрядность 48 бит, причем дополнительные 16 бит обеспечивают защиту от переполнения во время многих последовательных вычислений. Оставшиеся регистры - 32-разрядные.

Каждый из регистров Piccolo может обрабатываться как содержащий два независимых 16-битовых значения. Биты с 0 по 15 содержат младшую половину, биты с 16 по 31 - старшую половину. Команды могут задавать отдельную 16-битовую половину каждого регистра как операнд-источник, или задавать 32-битовый регистр в целом.

Piccolo также обеспечивает арифметику насыщения. Варианты команд умножения, сложения или вычитания предоставляют насыщенный результат, если результат больше, чем размер регистра-приемника. Если регистр-приемник является 48-битовым аккумулятором, то значение насыщается до 32 бит (т.е. нет способа насытить 48-битовое значение). Для 48-битовых регистров отсутствует распознавание переполнения. Это разумное ограничение, так как понадобилось бы, по крайней мере, 65536 команд умножения с накоплением, чтобы вызвать переполнение.

Каждый из регистров Piccolo либо помечен как "пустой" (флаг Е, см. фиг. 2), либо содержит некоторое значение (невозможно иметь пустую половину регистра). Сначала все регистры помечены как пустые. В каждом такте Piccolo пытается при помощи схемы управления пополнением 16 заполнить один из пустых регистров значением из входного буфера переупорядочивания. В противном случае, если в регистр записано значение из АЛУ, он больше не помечен как "пустой". Если в регистр записано значение из АЛУ и, в то же время существует значение, которое ожидает размещения в регистр из буфера переупорядочивания, то результат неопределен. Блок исполнения Piccolo остановится, если чтение сделано в пустой регистр.

Входной буфер переупорядочивания (БП) размещен между сопроцессорным интерфейсом и банком регистров Piccolo. Данные загружаются в БП при сопроцессорных пересылках ARM. БП содержит некоторое число 32-битовых значений, каждое с признаком, указывающим регистр Piccolo, для которого это значение предназначено. Признак также указывает, должны ли данные занять целый 32-битовый регистр или только нижние 16-бит 32-битового регистра. Если данные предназначены для целого регистра, то нижние 16 бит ввода будут пересланы в нижнюю половину целевого регистра, а верхние 16 бит - в верхнюю его половину (с дополнением знака, если целевой регистр представляет собой 48-битовый аккумулятор). Если данные предназначены только для нижней половины регистра (так называемые "Полрегистра"), то сначала будут пересланы нижние 16 бит.

Признак регистра всегда ссылается на физический регистр-приемник, переопределение регистров не производится (относительно переопределения регистров смотрите ниже).

В каждом такте Piccolo пытается переслать ввод данных из БП в банк регистров по следующему принципу.

- Каждый ввод в БП проверяется, и признаки сравниваются с регистрами, которые являются пустыми, это определяет, может ли быть сделана пересылка в регистр из части ввода или полностью из всего ввода.

- Из набора вводов, к которым может быть применена пересылка, выбирается самый старый ввод и его данные пересылаются в банк регистров.

- Признак этого ввода обновляется, чтобы пометить его как пустой. Если только часть ввода была переслана, только пересланная часть помечается как пустая.

Например, если целевой регистр - совершенно пустой, а выбранные вводы БП содержат данные, предназначенные для полного регистра, то пересылаются все 32 бита, а ввод помечается как пустой. Если нижняя половина целевого регистра пуста, а ввод в БП содержит данные, предназначенные для нижней половины регистра, то нижние 16 бит из ввода в БП пересылаются в нижнюю половину целевого регистра, а нижняя половина БП помечается как пустая.

Старшие и младшие 16-битовые части данных из любого ввода могут быть пересланы независимо. Если нет ввода, содержащего данные, которые могут быть пересланы в банк регистров, в этом такте не производится пересылки. В табл. 1 описаны все возможные комбинации состояний целевого ввода в БП и целевого регистра.

Чтобы подвести итог, можно сказать, что две половины регистра могут быть пополнены из БП независимо. Данные в БП помечаются либо как предназначенные для целого регистра, либо как два 16-битовых значения, предназначенных для нижней половины регистра.

Данные загружаются в БП с использованием команд ARM для сопроцессора. Как данные помечаются в БП, зависит от того, какая команда ARM для сопроцессора была использована для выполнения пересылки. Для заполнения БП данными имеются следующие команды ARM: LDР{<состояние>[<16/32><приемник>, [Rn]{!}, #<размер> LDP{<состояние>}<16/32>W<приемник>, <разворот>, [Rn]{!}, #<размер>
LDР{<состояние>} 16U<банк>, [Rn]{!}
МРR{<состояние>{<приемник>, [Rn]
МRР{<состояние>}<приемник>, [Rn]
Для конфигурирования БП предназначена следующая команда ARM:
LDPA<список банков>
Первые три ассемблируются как команды LDC, MPR и MRP - как команды MCR и LDPA ассемблируется как CDP.

В вышеприведенном <приемник> означает регистр Piccolo (A0-Z3), Rn - регистр ARM, <размер> - постоянную величину, число байт, которое должно быть ненулевым и кратным 4, и <разворот> означает константу (1, 2, 4, 8). Поля в фигурных скобках {} являются необязательными. Для того чтобы пересылка могла уместиться в буфере переупорядочивания, <размер> не должен превышать 32. Во многих случаях <размер> будет меньше этого предела, чтобы избежать зависания. Поле <16/32> указывает, должны ли загружаемые данные обрабатываться как 16-битовые, и должны быть предприняты действия по корректной загрузке данных с учетом формата их хранения ("младший байт по младшему адресу" ("Little Endian") или "старший байт по младшему адресу" ("Big Endian")), или как 32-битовые данные. (Эти форматы хранения данных более подробно описаны ниже).

Команды LDP пересылают некоторое количество элементов данных, помечая их как предназначенные для полного регистра. Команда будет загружать <размер>/4 слова с адреса Rn из памяти, вставляя их в БП. Количество слов, которые могут быть пересланы, ограничивается следующим:
- Величина <размер> должна быть ненулевой, кратной 4;
- <размер> должен быть меньше или равен размеру БП для конкретной разработки (8 слов в первой версии, и гарантируется, что в последующих версиях должно быть не меньше этого).

Первый пересланный элемент данных будет помечен признаком как предназначенный для <приемник>, второй - как предназначенный для <приемник>+1 и так далее (с разворотом с Z3 на А0). Если указан знак !, то регистр Rn впоследствии получает приращение <размер>.

Если используется вариант LDP16 над двумя 16-битовыми полусловами, образующими 32-битовые элементы данных, по мере того, как они вносятся из памяти, производятся специальные действия, учитывающие формат их хранения. Более подробное описание поддержки форматов хранения смотрите ниже.

Команды LDPW пересылают некоторое количество элементов данных в набор регистров. Первый пересланный элемент данных помечается как предназначенный для <приемник>, второй - как предназначенный для <приемник>+1 и т.д. Когда происходят пересылки с параметром <разворот>, следующий пересланный элемент помечается как предназначенный для <приемник> и так далее. Величина <разворот> указывается в полусловах.

Для LDPW применяются следующие ограничения:
- величина <размер> должна быть ненулевой, кратной 4;
- <размер> должен быть меньше или равен размеру БП для конкретной разработки (8 слов в первой версии, и гарантируется, что в последующих версиях должно быть не меньше этого);
- <приемник> может быть одним из (А0, Х0, Y0, Z0};
- <разворот> может быть одним из (2, 4, 8} полуслов для LDP32W и одним из (1, 2, 4, 8} полуслов для LDP16W;
- величина <размер> должна быть больше чем 2<разворот>, в противном случае разворота не происходит и вместо этого должна быть использована команда LDP. Например, команда
LDP32W Х0, 2, [R0]!, #8
загрузит два слова в БП, пометив их как предназначенные для полного регистра Х0. R0 будет увеличен на 8. Команда
LDP32W Х0, 4, [R0], #16
загрузит четыре слова в БП, пометив их как предназначенные для Х0, X1, Х0, X1 (в таком порядке). R0 не будет затронут.

Для LDP16W <разворот> может быть задан как 1, 2, 4, 8. Разворот со значением 1 приведет к тому, что все данные будут помечены как предназначенные для нижней половины регистра-приемника <приемник>.1. Это - случай "Полрегистра".

Например, команда
LDP16W Х0, 1, [R0]!, #8
загрузит два слова в БП, помечая их как 16-битовые данные, предназначенные для Х0.1. R0 будет увеличен на 8. Команда
LDP16W Х0, 4, [R0], #16
будет вести себя тем же образом, что и примеры LDP32W, за исключением того, что над данными могут быть выполнены специальные действия, учитывающие формат их хранения, по мере того как они получаются из памяти.

Все неиспользованные варианты кодирования для команды LDP могут быть зарезервированы для дальнейшего развития.

Для поддержки эффективной пересылки не выровненных по словам 16-битовых данных предоставляется команда LDP16U. Поддержка LDP16U обеспечивается для регистров с D4 по D15 (банки X, Y и Z). Команда LDP16U будет пересылать одно 32-битовое слово данных (содержащее два 16-битовых элемента данных) из памяти в Piccolo. Piccolo будет отбрасывать нижние 16 бит этих данных и сохранять верхние 16 бит в регистре хранения. Регистр хранения имеется для банков X, Y и Z. Если регистр хранения для банка загружен в первую очередь, характер исполнения команд LDP(W} изменяется, если данные предназначены для регистра в этом банке. Загруженные в БП данные формируются путем конкатенации (связывания) регистра хранения и нижних 16 бит данных, пересылаемых командой LDP. Верхние 16 бит пересылаемых данных помещаются в регистр хранения:
ввод<--данные.1; регистр _ хранения
регистр _ хранения <-- данные.h
Этот режим работы действует до тех пор, пока не будет выключен командой LDPA. Регистр хранения не записывает признак или размер регистра-приемника. Данные характеристики предоставляются командой, которая предоставляет следующее значение "данные.1".

Специальные действия, учитывающие формат хранения, всегда могут применяться к данным, возвращенным системой памяти. Не 16-битовый эквивалент LDP16U отсутствует, так как предполагается, что все 32-битовые элементы данных будут в памяти выровнены по словам.

Команда LDPA используется для отключения невыровненного режима работы, иницированного командой LDP16U. Невыровненный режим может быть отключен для банков X, Y, Z независимо. Например, команда
LDPA(X, Y)
выключит невыровненный режим, примененный к банкам Х и Y. Данные в регистрах хранения этих банков будут сброшены.

Допускается исполнение LDPA над банком, который не находится в невыровненном режиме, - данный банк останется в выровненном режиме.

Команда MPR помещает содержимое Rn регистра ARM в БП, предназначив его для регистра Piccolo <приемник>. Регистр-приемник <приемник> может быть любым полным регистром из диапазона A0-Z3. Например, команда
MPR X0, R3
будет пересылать содержимое R3 в БП, помечая данные как предназначенные для полного регистра X0.

При пересылке данных из ARM в Piccolo к ним не применяются специальные действия, учитывающие порядок их хранения, так как ARM имеет внутреннюю организацию "младший байт по младшему адресу".

Команда MPRW помещает содержимое Rn регистра ARM в БП, помечая его как два 16-битовых элемента данных, предназначенных для 16-битового регистра <приемник>.1 Piccolo.

Ограничения, накладываемые на <приемник>, те же самые, что и для команд LDPW (т.е. А0, X0, Y0, Z0). Например, команда
MPRW X0, R3
будет пересылать содержимое R3 в БП, помечая данные как 2 16-битовых величины, предназначенные для Х0.1. Нужно заметить, что, как и в случае LDP16W с разворотом 1, только нижняя половина 32-битового регистра может быть пунктом назначения.

Как и в случае с MPR, к данным не применяются специальные действия, учитывающие порядок их хранения.

Кодирование LDP представлено в табл.2.

Кодирование LDPW представлено в табл.3.

Кодирование LDP16U представлено в табл.4.

Кодирование LDPA представлено в табл. 5.

Кодирование MPR представлено в табл.6.

Кодирование MPRW представлено в табл.7.

Выходной FIFO может содержать до восьми 32-битовых значений. Эти значения пересылаются из Piccolo с использованием одного из следующих (ARM) кодов операций:

Первая сохраняет <размер>/4 слова из выходного FIFO по адресу, данному регистром Rn ARM, индексируя Rn, если присутствует знак !. Чтобы предотвратить зависание, <размер> не должен быть больше размера выходного FIFO (8 вводов в данной разработке). Если используется вариант STP16, к получаемым из системы памяти данным могут применяться специальные действия, учитывающие порядок их хранения.

Команда MRP удаляет одно слово из выходного FIFO и помещает его в регистр Rn ARM. Как и в случае с MPR, к данным не применяются специальные действия, учитывающие порядок их хранения.

Кодирование ARM для STP представлено в табл.8.

Кодирование ARM для MRP представлено в табл.9.

Набор команд Piccolo предполагает внутреннюю организацию, при которой данные хранятся в формате "младший байт по младшему адресу". Например, при обращении к 32-битовому регистру как 16-битовым половинам, предполагается, что младшая половина занимает биты с 15 по 0. Piccolo может работать в системе с памятью или периферийными устройствами, которые имеют формат хранения данных "старший байт по младшему адресу" и должен, следовательно, следить за правильным характером загрузки 16-битовых упакованных данных.

Piccolo (т.е. сопроцессор, адаптированный для ЦОС), как и ARM (например, микропроцессоры ARM, выпускаемые фирмой Advanced RISC Machines Limited, Кембридж, Великобритания), имеют конфигурационный контакт 'BIGEND', который может контролировать программист, возможно при помощи программируемого периферийного устройства. Piccolo использует этот контакт для конфигурирования входного буфера переупорядочивания и выходного FIFO.

Когда ARM загружает упакованные 16-битовые данные в буфер переупорядочивания, он должен указать это, используя 16-битовую форму команды LDP. Эта информация соединяется с состоянием конфигурационного входа 'BIGEND' для размещения данных в хранящих регистрах-защелках и буфере переупорядочивания в соответствующем порядке. В частности, в режиме с форматом хранения "старший байт по младшему адресу" регистр хранения хранит нижние 16 бит загруженного слова, и дополняется в качестве пары верхними 16 битами следующей загрузки. Содержимое регистра хранения всегда ограничивается нижними 16 битами пересланного в буфер переупорядочивания слова.

Выходной FIFO может содержать либо упакованные 16-битовые, или 32-битовые данные. Программист должен использовать правильную форму команды STP, так чтобы Piccolo мог гарантировать, что 16-битовые данные предоставляются на правильных половинах шины данных. В конфигурации, соответствующей формату хранения "старший байт по младшему адресу", верхние и нижние 16-битовые половины меняются местами, когда используются 16-битовые формы STP.

Piccolo имеет 4 личных регистра, доступ к которым может иметь только ARM. Они называются S0-S2. Эти регистры могут быть доступны только при помощи команд MRC и MCR. Коды операций следующие:
MPSR Sn, Rm
MRPS Rm, Sn
Эти операции пересылают 32-битовое значение между регистром ARM Rm и личным регистром Sn. Они кодируются в ARM как пересылка регистров сопроцессора (см. табл.10).

Регистр S0 содержит уникальный ID Piccolo и код модификации (см. табл. 11).

Биты [3:0] содержат номер модификации для процессора.

Биты[15: 4] содержат 3-значный номер изделия в двоично-десятичном формате: 0500 для Piccolo.

Биты[23:16] содержат версию архитектуры: 000 = Версия 1.

Биты[31:24] содержат ASCII код торговой марки разработчиков:
041 = А = ARM Ltd.

Регистр S1 - регистр состояния Piccolo (см. табл.12).

Основные флаги кодов состояния (N, Z, С, V).

Дополнительные флаги кодов состояния (SN, SZ, SC, SV).

Бит E: Piccolo выключен ARM и остановился.

Бит U: Piccolo встретил команду UNDEFINED и остановился.

Бит В: Piccolo встретил команду BREAKPOINT и остановился.

Бит Н: Piccolo встретил команду HALT и остановился.

Бит A: Piccolo столкнулся с отказом памяти и остановился.

Бит D: Piccolo обнаружил состояние зависания и остановился (см. ниже).

Регистр S2 - счетчик команд Piccolo (см. табл.13).

Запись в счетчик команд заставит Piccolo начать выполнение программы с этого адреса (оставляя его в состоянии останова, если он остановлен). При сбросе счетчик команд не определен, так как Piccolo всегда запускается путем записи в счетчик команд.

Во время выполнения Piccolo всегда отслеживает исполнение команд и состояние сопроцессорного интерфейса. Если он обнаружит, что:
- Piccolo остановился, ожидая либо пополнения регистра, либо получения выходным FIFO имеющегося ввода.

- Сопроцессорный интерфейс находится в состоянии активного ожидания из-за недостаточного пространства в БП или недостаточного количества элементов в выходном FIFO.

Если обе эти ситуации обнаружены, Piccolo устанавливает D-бит в своем регистре состояния, останавливается и отказывается от исполнения сопроцессорной команды ARM, вызывая в ARM прерывание исполнения в связи с неопределенной командой.

Это обнаружение состояний зависания позволяет создать такую систему, которая, по крайней мере, предупредит программиста, что возникло определенное состояние и сообщит точную точку сбоя, путем считывания регистров и счетчиков команд ARM и Piccolo. Необходимо подчеркнуть, что зависание может случиться только из-за некорректной программы или, возможно, из-за того, что другая часть системы исказила состояние Piccolo. Зависание не может возникнуть из-за нехватки данных или "перегрузки".

Имеется несколько операций, которые могут быть использованы для управления Piccolo из ARM, они обеспечиваются командами CDP. Эти команды CDP будут приняты только в том случае, если ARM находится в привилегированном состоянии. В противном случае Piccolo откажется от исполнения команды CDP, что приведет к прерыванию ARM по неопределенной команде. Доступны следующие операции:
_ Сброс
_ Ввод режима доступа к состоянию
_ Включение
_ Отключение
Может быть произведен сброс Piccolo программным путем, используя команду PRESET.

PRESET; Очистить состояние Piccolo
Кодирование этой команды представлено в табл.13.

Когда эта команда выполняется, происходит следующее:
- Все регистры помечаются как пустые (готовые для пополнения).

- Входной БП очищается.

- Выходной FIFO очищается.

- Счетчики цикла сбрасываются.

- Piccolo переводится в состояние останова (и будет установлен Н бит регистра 32).

Выполнение команды PRESET до ее полного завершения может занять несколько тактов (2-3 для данного варианта). Пока она исполняется, последующие команды ARM для сопроцессора, которые должны быть выполнены Piccolo, будут в состоянии активного ожидания.

В режиме доступа к состоянию, состояние Piccolo может быть сохранено и восстановлено с использованием команд STC и LDC (относительно получения доступа из ARM к состоянию Piccolo смотрите ниже). Чтобы ввести режим доступа к состоянию, сначала должна быть выполнена команда PSTATE:
PSTATE; Ввести режим доступа к состоянию
Кодирование этой команды представлено в табл.15.

При выполнении команда PSTATE:
- Остановит Piccolo (если он уже не был остановлен), устанавливая Е бит в регистре состояния Piccolo.

- Сконфигурирует Piccolo в его "Режим доступа к состоянию".

Выполнение команды PSTATE до ее полного завершения может занять несколько тактов, так как конвейер команд Piccolo должен очиститься перед тем, как он сможет остановиться. Пока она исполняется, последующие команды ARM для сопроцессора, которые должны быть выполнены Piccolo, будут в состоянии активного ожидания.

Команды PENABLE и PDISABLE используются для быстрого контекстного переключения. Когда Piccolo отключен, доступны только личные регистры 0 и 1 (регистры ID и Состояние), и, кроме того, только из привилегированного режима. Доступ к любому другому состоянию или любой доступ из режима пользователя вызовет исключительную ситуацию "неопределенная команда". Отключение Piccolo заставляет его остановить выполнение. Когда Piccolo остановил выполнение, он подтвердит этот факт, установив Е бит в регистре состояния.

Piccolo включается выполнением команды PENABLE:
PENABLE; Включить Piccolo
Кодирование этой команда представлено в табл.16.

Piccolo отключается выполнением команды PDISABLE:
PDISABLE; Отключить Piccolo
Кодирование этой команды представлено в табл.17.

Когда выполняется эта команда, происходит следующее:
- Конвейер команд Piccolo очистится.

- Piccolo остановится и будет установлен Н бит в регистре состояния.

Кэш команд Piccolo содержит команды Piccolo, которые управляют его магистралью данных. Если он имеется, гарантируется, что он содержит, по крайней мере, 64 команды, с началом на 16-словной границе. Следующий код операции ARM ассемблируется в MCR. Его работа - заставить кэш выбрать строку из (16) команд, начиная с заданного адреса (который должен располагаться на 16-словной границе). Эта выборка происходит, даже если кэш уже содержит данные, относящиеся к этому адресу.

PMIR Rm
Piccolo должен быть остановлен, перед тем как PMIR может быть произведена.

MCR кодирование этого кода операции представлено в табл.18.

В этом разделе рассматривается набор команд Piccolo, которые управляют его магистралью данных. Каждая команда длиной 32 бита. Команды считываются из кэша команд Piccolo.

Декодирование набора команд - достаточно простое. Верхние 6 бит (с 26 по 31) дают основной код операции, при этом биты с 22 по 25 предоставляют второстепенный код для нескольких особых команд. Биты с серым оттенком в настоящее время не используются и зарезервированы для дальнейшего развития (в настоящее время они должны содержать указанное значение).

Имеется одиннадцать основных классов команд. Это не соответствует полностью основному коду операций, содержащемуся в команде, для легкости декодирования некоторых подклассов (см. табл. 19).

Команды в табл.19 имеют следующие названия:
Стандартная операция с данными
Логическая операция
Условное сложение/вычитание
Неопределенная
Сдвиги
Выбор
Неопределенная
Параллельный выбор
Умножение с накоплением
Неопределенная
Умножение с удвоением
Неопределенная
Пересылка непосредственного операнда со знаком
Неопределенная
Повторение
Повторение
Операции со списком регистров
Переход
Пересылка параметров переопределения
Останов/прерывание
Формат для каждого класса команд подробно описан в следующих разделах. Поля операндов-источников и операндов-приемников являются общими для большинства команд и подробно описаны в отдельных разделах, так же как и переопределение регистров.

Большинство команд требуют двух операндов-источников;
Источник 1 и Источник 2. Некоторые исключения представляет насыщение абсолютного значения.

Операнд Источник 1 имеет следующий 7-битовый формат (см. табл.20).

Элементы поля в табл.20 имеют следующее значение:
- Размер - указывает размер операнда, который нужно прочесть (1=32-битовый, 0=16-битовый).

- Пополнение - задает, что регистр должен быть помечен как пустой после прочтения и может быть пополнен из БП.

- Номер регистра - кодирует, какой из 16 32-битовых регистров нужно прочесть.

- H/L - для 16-битовых чтений указывает, какую половину 32-битового регистра нужно прочесть. Для 32-битовых операндов, когда установлен - указывает, что две 16-битовых половины нужно поменять местами (см. табл.21).

Размер регистра задается в ассемблере добавлением суффикса к номеру регистра:.1 для младших 16 бит, h для старших 16 бит или, h для 32 бит с переставленными местами верхней и нижней шестнадцатибитовыми половинами.

Основной Источник 2 имеет один из следующих трех 12-битовых форматов, представленных в табл.22.

На фиг. 4 изображено устройство мультиплексора, реагирующего на бит H/L и бит Размер для переключения соответствующих половин выбранного регистра на магистраль данных Piccolo. Если бит Размер указывает 16 бит, тогда схема дополнения знака заполняет биты старшего порядка магистрали данных соответственно нулями или единицами.

Первое кодирование задает источник как регистр, при этом поля имеют то же кодирование, что и спецификатор источника 1. Поле МАСШТАБ задает масштаб, который нужно применить к результату АЛУ (см. табл.23).

8-битовое непосредственное кодирование с циклическим сдвигом позволяет создать 32-битовый непосредственный операнд, который может выражаться 8-битовым значением и 2-битовым циклическим сдвигом. В табл.24 показаны значения непосредственных операндов, которые могут быть созданы из 8-битового значения XY.

6-битовое непосредственное кодирование позволяет использовать 6-битовый непосредственный операнд без знака (диапазон от 0 до 63), вместе с масштабом, примененным к выводу АЛУ.

Кодирование основного Источника 2 является общим для большинства вариантов команд. Существует несколько исключений из этого правила, которые поддерживают ограниченную подгруппу кодирования Источника 2 или слегка ее изменяют:
- Команды "Выбор".

- Команды "Сдвиг".

- Параллельные операции.

- Команды "Умножение с накоплением".

- Команды "Умножение с удвоением".

Команды "Выбор" поддерживают только операнд, который представляет собой регистр или 6-битовый непосредственный операнд без знака. Масштаб недоступен, так как эти биты используются полем "СОСТОЯНИЕ" команды (см. табл.25).

Команды "Сдвиг" поддерживают только операнд, который представляет собой 16-битовый регистр или 5-битовый непосредственный операнд со знаком в диапазоне между 1 и 31. Масштаб результата недоступен (см. табл.26).

В случае параллельных операций, если в качестве источника операнда указан регистр, должно быть произведено 32-битовое чтение. Непосредственное кодирование имеет немного другой смысл для параллельных операций. Это позволяет дублировать непосредственный операнд в обе 16-битовые половины 32-битового операнда. Для параллельных операций доступен слегка ограниченный диапазон масштабов (см. табл.27).

Если используется 6-битовый непосредственный операнд, то он всегда дублируется в обе половины 32-битовой величины. Если используется 8-битовый непосредственный операнд, то он дублируется только, если циклический сдвиг указывает, что 8-битовый непосредственный операнд должен быть циклически сдвинут в верхнюю половину 32-битовой величины (см. табл.28).

Для операций параллельного выбора масштаб отсутствует, поле МАСШТАБ для этих команд должно быть установлено в 0.

Команды умножения с накоплением не позволяют задавать 8-битовый циклически сдвинутый непосредственный операнд. Бит 10 поля используется для частичного указания на то, какой аккумулятор использовать. Источник 2 подразумевается как 16-битовый операнд (см. табл.29).

Команды умножения с удвоением не позволяют использовать константу. Может быть указан только 16-битовый регистр. Бит 10 поля используется для частичного указания на то, какой аккумулятор использовать (см. табл.30).

Некоторые команды всегда подразумевают 32-битовую операцию (например, ADDADD), и в этих случаях бит размера должен быть установлен в 1; бит H/L используется для возможной взаимной перестановки двух 16-битовых половин 32-битового операнда. Некоторые команды всегда подразумевают 16-битовую операцию (например, MUL), и бит размера должен быть установлен в 0. Тогда бит H/L выбирает, какая половина регистра используется (предполагается, что отсутствующий бит размера очищен), Команды "Умножение с накоплением" разрешают независимое задание аккумулятора-источника и регистров-приемников. Для этих команд биты Размер используются для указания аккумулятора-источника, а биты размера подразумеваются типом команды как 0.

Когда читается 16-битовое значение (через шины А или В) оно автоматически преобразуется дополнением знака в 32-битовую величину. Если читается 48-битовый регистр (через шины А или В), только нижние 32 бита появляются на шине. Следовательно, во всех случаях Источник 1 и Источник 2 преобразуются в 32-битовые значения. Только команды накопления, использующие шину С, могут обращаться к полным 48 битам регистра-аккумулятора.

Если установлен бит пополнения, после использования регистр помечается как пустой и будет пополнен из БП по обычному механизму пополнения (смотрите раздел по БП). Piccolo не будет останавливаться, кроме случая, когда регистр снова используется в качестве операнда-источника до того, как произошло пополнение. Минимальное число тактов перед тем, как пополненные данные станут достоверными (наилучший случай - данные ожидают в верхней части БП), будет либо 1, либо 2. Следовательно, желательно было бы не использовать пополненные данные в команде, следующей за запросом на пополнение. Если использования операнда в последующих двух командах можно избежать, это нужно сделать, так как это предотвратит потерю производительности в более глубоких разработках, использующих конвейер.

Бит пополнения указывается в ассемблере добавлением суффикса '^' к номеру регистра. То, какая часть регистра помечается как пустая, зависит от регистрового операнда. Две половины каждого регистра могут быть помечены для пополнения независимо (например, Х0.1^ будет помечать для пополнения только нижнюю половину Х0, Х0^ будет помечать для пополнения весь регистр). Когда пополняется верхняя "половина" (биты 47:16) 48-битового регистра, 16-битовые элементы данных записываются в биты 31:16 и расширяются путем дополнения знака до бита 47.

Если делается попытка пополнить один и тот же регистр дважды (например, ADD X1, Х0^, Х0^, то имеет место только одно пополнение. Ассемблер разрешит только синтаксис ADD Х1,Х0/Х0^.

Если попытка чтения регистра предпринята до того, как регистр был пополнен. Piccolo остановится, ожидая того, что регистр должен быть пополнен. Если регистр помечен для пополнения и затем обновляется до того, как пополненное значение было прочтено, результат непредсказуемый (например, ADD X0,X0^,X1 является непредсказуемой, так как она помечает Х0 для пополнения и затем пополняет его размещением в него суммы Х0 и X1).

4-битовое поле масштаба кодирует четырнадцать типов масштабов:
- ASR #0, 1, 2, 3, 4, 6, 8, 10
- ASR #12 пo 16
- ASL #1
Параллельные команды Мах/Min не предоставляют масштаб, и, таким образом, вариант шестибитовой константы как источника 2 не используется (устанавливается ассемблером в 0).

В команде REPEAT поддерживается переопределение регистров, позволяя команде REPEAT обращаться к движущемуся "окну" регистров без выхода из цикла. Ниже это описано более подробно.

Операнды-приемники имеют 7-битовый формат, представленный в табл.31.

Имеется десять вариантов этого основного кодирования(см. табл.32).

В табл.33 показан характер исполнения каждого кодирования.

Во всех случаях результат любой команды перед записью обратно в регистр или вставкой в выходной FIFO представляет собой 48-битовую величину. Существуют два случая.

Если запись состоит из 16 бит, 48-битовая величина уменьшается до 16-битовой величины выбором нижних 16 бит [15:0]. Если команда производит насыщение, то значение будет насыщено в диапазоне от -2^15 до 2^15-1. 16-битовое значение затем записывается обратно в указанный регистр и, если установлен бит Запись в FIFO, - в выходной FIFO. Если оно записывается в выходной FIFO, то оно сохраняется до тех пор, пока не будет записано следующее 16-битовое значение, когда значения будут соединены в пару и помещены в выходной FIFO как единое 32-битовое значение.

Для 32-битовых записей 48-битовая величина уменьшается до 32-битовой величины выбором нижних 32 бит [31:0].

Как для 32-битовых, так и 48-битовых записей, если команда производит насыщение, 48-битовое значение будет преобразовано в 32-битовую величину в диапазоне от -2^31 до 2^31-1. Вслед за насыщением:
- Если производится обратная запись в аккумулятор, будут записаны полные 48 бит.

- Если производится обратная запись в 32-битовый регистр, записываются биты [31:0].

- Если указана обратная запись в выходной FIFO, снова записываются биты [31:0].

Размер приемника задается в Ассемблере указанием.1 или h после номера регистра. Если не производится обратной записи в регистр, тогда номер регистра не имеет значения, так что пропустите регистр-приемник для указания отсутствия записи в регистр или используйте ^ для указания записи только в выходной FIFO. Например, SUB, X0, Y0 эквивалентно СМР Х0, Y0 и ADD^, X0, Y0 помещает значение X0+Y0 в выходной FIFO.

Если в выходном FIFO нет места для значения, Piccolo останавливается, ожидая, пока пространство не станет доступным.

Если для записи выводится 16-битовое значение, например ADD X0.h^, X1, Х2, то значение хранится до тех пор, пока не будет записано второе 16-битовое значение. Два значения затем соединяются и помещаются в выходной FIFO как 32-битовое число. Первая записанная 16-битовая величина всегда появляется в младшей половине 32-битового слова. Данные, введенные в выходной FIFO, помечаются либо как 16-, либо как 32-битовые, чтобы позволить исправить формат хранения в системах "старший байт по младшему адресу".

Если между двумя 16-битовыми записями записывается 32-битовое значение, то действие не определено.

В команде REPEAT поддерживается переопределение регистров, позволяя команде REPEAT обращаться к движущемуся "окну" регистров без выхода из цикла. Ниже это описано более подробно.

В предпочтительных вариантах реализации настоящего изобретения, команда REPEAT предоставляет механизм изменения способа, по которому регистровые операнды задаются внутри цикла. При таком механизме регистры, к которым должен произойти доступ, определяются функцией регистрового операнда в команде и смещением в банке регистров. Смещение изменяется программным путем, предпочтительно в конце каждого цикла команд. Механизм может работать независимо для регистров, находящихся в банках X, Y, Z. В предпочтительных вариантах, эта возможность отсутствует для регистров в банке А.

Можно использовать понятие логического и физического регистра. Операнды команды представляют собой ссылки на логические регистры, и они затем отображаются в ссылки на физические регистры, идентифицирующие конкретные регистры 10 Piccolo. Все операции, включая пополнение, производят действия над физическим регистром. Переопределение регистров происходит только на стороне командного потока Piccolo - загруженные в Piccolo данные всегда предназначены для физического регистра, и переопределения не производится.

Механизм переопределения рассмотрен далее со ссылкой на фиг.5, которая представляет собой блок-схему, показывающую ряд внутренних компонентов сопроцессора Piccolo 4. Элементы данных, извлеченные ядром ARM 2 из памяти, помещаются в буфер 12 переупорядочивания, регистры 10 Piccolo пополняются из буфера 12 переупорядочивания способом, описанным ранее со ссылкой на фиг.2. Команды Piccolo, которые хранятся в кэше 6, проходят в дешифратор 50 команд в Piccolo 4, где они декодируются перед тем, как поступить в ядро 54 процессора Piccolo. Ядро 54 процессора Piccolo включает схему 20 умножителя/сумматора, схему 22 накопления/сброса и схему 24 масштаба/насыщения, рассмотренные ранее со ссылкой на фиг.3.

Если дешифратор 50 команд обрабатывает команды, образующие часть цикла команд, определенного командой REPEAT, указывающей, что должно иметь место переопределение ряда регистров, то для выполнения переопределения задействуется логика 52 переопределения регистров, также называемая в данном описании блоком переопределения регистров. Логика 52 переопределения регистров может являться составной частью дешифратора 50 команд, хотя специалистам в данной области очевидно, что она может обеспечиваться как блок 52, совершенно отдельный от дешифратора 50 команд.

Команда в типичном случае будет включать один или более операндов, идентифицирующих регистры, содержащие элементы данных, требующиеся команде. Например, типичная команда может включать два операнда-источника и один операнд-приемник, идентифицирующие два регистра, содержащие требующиеся команде элементы данных, и регистр, в который должен быть помещен результат команды. Логика 52 переопределения регистров принимает операнды команды из дешифратора 50 команд, причем эти операнды идентифицируют ссылки на логические регистры. На основе ссылок на логические регистры, логика переопределения регистров определит должно или не должно быть применено переопределение и затем применит переопределение на физические регистры так, как это требуется. Если определено, что переопределения применять не нужно, в качестве ссылок на физические регистры будут предоставляться ссылки на логические регистры. Предпочтительный способ, которым осуществляется переопределение, будет рассмотрен более подробно позднее.

Каждая выходная ссылка на физический регистр из логики переопределения регистров проходит в ядро 54 процессора Piccolo, так что ядро процессора может затем применить команду к элементу данных в конкретном регистре 10, идентифицированном ссылкой на физический регистр.

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

Механизмом переопределения применяется ряд параметров, эти параметры будут рассмотрены детально со ссылкой на фиг.6, которая представляет собой блок-схему, иллюстрирующую, каким образом различные параметры используются логикой 52 переопределения регистров. Нужно отметить, что эти параметры являются заданными значениями, которые связаны с некоторой точкой в переопределяемом банке, эта точка, например, представляет собой дно банка.

Логика 52 переопределения регистров может рассматриваться как содержащая два основных логических блока, а именно блок 56 переопределения и блок 58 обновления базы. Логика 52 переопределения регистров использует указатель базы, который обеспечивает значение смещения, которое нужно добавить к ссылке на логический регистр, причем это значение указателя базы предоставляется блоку 56 переопределения блоком 58 обновления базы.

Для определения первоначального значения указателя базы может быть использован сигнал БАЗА_ НАЧАЛО, причем он, например, в типичном случае, равен нулю, хотя может быть задано и какое-либо другое значение. Этот сигнал БАЗА_ НАЧАЛО проходит в мультиплексор 60 в блоке 58 обновления базы. Во время первой итерации цикла команд, сигнал БАЗА_НАЧАЛО, минуя мультиплексор 60, проходит в элемент 66 хранения, тогда как для последующих итераций цикла мультиплексором в элемент 66 хранения подается следующее значение указателя базы.

Выходной сигнал из элемента 66 хранения проходит как текущее значение указателя базы в логику 56 переопределения и также проходит на один из входов в сумматор 62 в логике 58 обновления базы. Сумматор 62 также принимает сигнал БАЗА_ ПРИР, который предоставляет значение приращения базы. Сумматор 62 устроен таким образом, чтобы осуществлять приращение текущего значения указателя базы, подаваемого элементом 66 хранения на значение БАЗА_ПРИР, и подавать результат в схему 64 модуля.

Схема модуля также принимает значение БАЗА_РАЗВ и сравнивает это значение с выходным сигналом указателя базы из сумматора 62. Если увеличенное на приращение значение указателя базы равно или превышает значение БАЗА_РАЗВ, новый указатель базы разворачивается в новое значение смещения. Выходной сигнал схемы 64 модуля является тогда следующим значением указателя базы, которое должно быть сохранено в элементе 66 хранения. Этот выходной сигнал предоставляется мультиплексору 60 и затем оттуда в элемент 66 хранения.

Однако это следующее значение указателя базы не может быть сохранено в элементе 66 до тех пор, пока сигнал ОБНОВЛЕНИЕ_БАЗЫ не будет принят элементом 66 хранения от аппаратного средства осуществления циклов, управляющего командой REPEAT. Сигнал ОБНОВЛЕНИЕ_ БАЗЫ будет производиться аппаратным средством осуществления циклов периодически, например, каждый раз, когда должен быть повторен цикл команд. Когда сигнал ОБНОВЛЕНИЕ_БАЗЫ принимается элементом 66 хранения, последний будет в результате перезаписи замещать предыдущее значение указателя базы следующим значением, предоставленным мультиплексором 60.

Таким образом, значение указателя базы, поданное логике 58 переопределения будет меняться на новое значение указателя базы.

Физический регистр, к которому должно производиться обращение внутри переопределенной секции банка регистров, определяется сложением ссылки на логический регистр, содержащейся в операнде команды, и значением указателя базы, предоставленным логикой 58 обновления базы. Это сложение производится сумматором 68, и выходной сигнал проходит в схему 70 модуля. В предпочтительных вариантах схема 70 модуля также принимает значение разворота регистров, и, если выходной сигнал от сумматора 68 (сложение ссылки на логический регистр и значения указателя базы) превышает значение разворота для регистров, результат будет разворачиваться к дну переопределенной области. Выходной сигнал схемы 70 модуля затем поступает в мультиплексор 72.

Логике 74 внутри блока 56 переопределения поставляется значение РЕГ_ЧИСЛО, идентифицирующее количество регистров в банке, которые должны быть переопределены. Логика 74 сравнивает это значение РЕГ_ ЧИСЛО со ссылкой на логический регистр, и выдает управляющий сигнал мультиплексору 72, зависящий от результата этого сравнения. Мультиплексор 72 принимает в качестве своих двух входных сигналов ссылку на логический регистр и выходной сигнал от схемы 70 модуля (переопределенная ссылка на регистр). В предпочтительных вариантах настоящего изобретения, если ссылка на логический регистр меньше, чем значение РЕГ_ЧИСЛО, то логика 74 дает команду мультиплексору 72 вывести переопределенную ссылку на регистр как "Ссылку на физический регистр". Если, однако, ссылка на логический регистр больше или равна значению РЕГ_ЧИСЛО, то логика 74 дает команду мультиплексору 72 вывести непосредственно ссылку на логический регистр как ссылку на физический регистр.

Как предварительно упоминалось, в предпочтительных вариантах, именно команда REPEAT активизирует механизм переопределения. Как будет рассмотрено более подробно позднее, команды REPEAT обеспечивают четыре цикла с нулевым тактом в аппаратном средстве. Эти аппаратные циклы показаны на фиг.5 как часть дешифратора 50 команд. Каждый раз, когда дешифратор 50 команд запрашивает команду из кэша 6, кэш поставляет эту команду в дешифратор команд, после чего дешифратор команд определяет, является ли полученная команда командой RETURN. Если так, один из аппаратных циклов конфигурируется для обработки этой команды REPEAT.

Каждая команда повторения задает количество команд в цикле и количество раз прохождения цикла (которое либо является константой, либо считывается из регистра Piccolo). Для определения аппаратного цикла предоставляются два кода операций - REPEAT и NEXT, причем код операции NEXT используется просто как ограничитель и не ассемблируется как команда. REPEAT идет в начале цикла, a NEXT ограничивает конец цикла, позволяя ассемблеру вычислить количество команд в теле цикла. В предпочтительных вариантах, команда REPEAT может включать параметры переопределения, такие как РЕГ_ЧИСЛО, БАЗА_ПРИР, БАЗА_РАЗВ и РЕГ_РАЗВ, которые должны использоваться логикой 52 переопределения регистров.

Для хранения параметров переопределения, используемых логикой переопределения регистров, может быть предоставлен ряд регистров. В этих регистрах может располагаться ряд наборов предварительно определенных параметров переопределения, в то время как некоторые регистры оставляются для хранения параметров переопределения, определенных пользователем. Если параметры переопределения, заданные с командой REPEAT, равны одному из наборов предварительно определенных параметров переопределения, тогда используется соответствующее кодирование REPEAT, причем это кодирование заставляет мультиплексор или подобное устройство предоставлять соответствующие параметры переопределения из регистров непосредственно в логику переопределения регистров. Если, с другой стороны, параметры переопределения не совпадают с любым из наборов предварительно определенных параметров переопределения, то ассемблер создаст команду "Пересылка параметров переопределения" (RMOV), которая позволяет сконфигурировать параметры переопределения, определенные пользователем, при этом за командой RMOV непосредственно следует команда REPEAT. Предпочтительно, чтобы определенные пользователем параметры переопределения размещались командой RMOV в регистрах, оставленных для хранения таких определенных пользователем параметров переопределения, а мультиплексор мог бы затем программироваться таким образом, чтобы поставлять содержимое тех регистров в логику переопределения регистров.

В предпочтительных вариантах, параметры РЕГ_ЧИСЛО, БАЗА_ПРИР, БАЗА_РАЗВ и РЕГ_РАЗВ принимают одно из значений, указанных в табл.34.

Возвращаясь к фиг.6, ниже приводится пример того, как различные параметры используются блоком 56 переопределения (в этом примере логические и физические значения регистров относятся к конкретному банку):
if (Логический регистр <РЕГ_ЧИСЛО)
РЕГ__ЧИСЛО
else
Физический регистр = Логический регистр
end if
В конце цикла, перед тем, как начнется следующая итерация цикла, логикой обновления базы 58 производится следующее обновление указателя базы:
База = База + БАЗА_ПРИР) MOD БАЗА_РАЗВ
В конце цикла переопределения переопределение регистров будет отключено, и все регистры тогда станут доступны как физические регистры. В предпочтительных вариантах только одна команда переопределения REPEAT будет активна в любой момент времени. Циклы, тем не менее, могут быть вложенными, но только один может обновлять переменные переопределения в любое конкретное время. Однако далее можно будет увидеть, что, при желании, повторения переопределения могут быть вложены.

Чтобы проиллюстрировать полученные преимущества, касающиеся плотности кода, как результат использования механизма переопределения согласно предпочтительному варианту реализации настоящего изобретения, рассмотрим типичный алгоритм фильтра блока. Принципы алгоритма фильтра блока сначала будут изложены со ссылкой на фиг.7. Как показано на фиг.7, регистр-аккумулятор А0 устроен таким образом, чтобы накапливать результаты ряда операций умножения, причем эти операции представляют собой умножение коэффициента с0 на элемент данных d0, умножение коэффициента с1 на элемент данных dl, умножение коэффициента с2 на элемент данных d2 и т. д. Регистр А1 накапливает результаты похожего набора операций умножения, но на этот раз набор коэффициентов сдвинут таким образом, что с0 теперь умножается на dl, с1 теперь умножается на d2, c2 теперь умножается на d3 и т.д. Подобным образом, регистр А2 накапливает результаты умножения значений данных на значения коэффициентов, сдвинутых еще на шаг вправо таким образом, что с0 умножается на d2, с1 умножается на d3, c2 умножается на d4 и т.д. Этот процесс сдвига, умножения и накопления затем повторяется с размещением результата в регистре A3.

Если не используется переопределение регистров согласно предпочтительному варианту настоящего изобретения, то для выполнения команды фильтра блока потребуется следующий цикл команд:
; начать с 4 новыми значениями данных
ZERO {A0-A3}; обнулить аккумуляторы
REPEAT Z1; Z1 = (число коэффициентов, -4)
; сделать для следующих четырех коэффициентов, за первый
; проход:
; а0+=d0c0+d1c1+d2c2+d3c3
; a1+=d1c0+d2c1+d3c2+d4c3
; a2+=d2c0+d3c1+d4c2+-d5c3;
; а3+=d3c0+d4c1+d5c2+d6c3
MULA А0, X0.1^, Y0.1, А0; а0 += d0c0, и загрузить d4
MULA A1, X0.h, Y0.1, A1; al += d1-c0
MULA A2, X1.1, Y0.1, A2; a2 += d2c0
MULA A3, X1.h, Y0.1^, A3; a3 += d3c0, и загрузить c4
MULA А0, X0.h^, Y0.h, А0; а0 += d1c1, и загрузить d5
MULA A1, X1.1, Y0.h, A1; a1 += d2c1
MULA A2, X1.h, Y0.h, A2; a2 += d3c1
MULA A3, X0.1, Y0.h^, A3; a3 += d4c1, и загрузить с5
MULA А0, X1.1^, Y1.1, А0; а0 += d2c2, и загрузить d6
MULA A1, X1.h, Y1.1, A1; a1 += d3c2
MULA A2, X0.1, Y1.1, A2; a2 += d4c2
MULA A3, X0.h, Y1.1^, A3; a3 += d5c2, и загрузить с6
MULA А0, X1.h^, Y1.h, А0; а0 += d3c3, и загрузить d7
MULA A1, X0.1, Y1.h, A1; a1 += d4c3
MULA A2, X0.h, Y1.h, A2; a2 += d5c3
MULA A3, X1.1, Y1.h^, A3; a3 += d6c3, и загрузить с7
NEXT
В этом примере значения данных размещаются в банке регистров X, а значения коэффициентов размещаются в банке регистров Y. В качестве первого этапа, четыре регистра-аккумулятора А0, A1, A2 и A3 устанавливаются в ноль. Когда регистры-аккумуляторы сброшены, вводится цикл команд, который ограничивается командами REPEAT и NEXT. Значение Z1 идентифицирует количество раз, которые должен быть повторен цикл команд, и по причинам, которые будут рассмотрены позднее, оно фактически будет равно количеству коэффициентов (с0, с1, с2 и т.д.), разделенному на 4.

Цикл команд содержит 16 команд умножения с накоплением (MULA), которые после первой итерации цикла разместят результаты вычислений, показанных в программном коде, расположенном между REPEAT и первой командой MULA, в регистрах А0, А1, А2, A3. Чтобы проиллюстрировать, как работают команды умножения с накоплением, мы рассмотрим первые четыре команды MULA. Первая команда умножает значение данных в первых, или младших, 16 битах нулевого регистра банка Х на младшие 16 бит в нулевом регистре банка Y и добавляет результат в регистр-аккумулятор АО. В то же время младшие 16 бит нулевого регистра банка Х помечаются битом пополнения, - это указывает, что часть регистра может теперь быть пополнена новым значением данных. Пометка производится именно таким образом, потому что, как видно из фиг. 7, как только элемент данных d0 был умножен на коэффициент с0 (это представлено первой командой MULA), d0 больше не потребуется для оставшейся части команд фильтра блока и, следовательно, может быть заменен новым значением данных.

Вторая команда MULA затем умножает вторые, или старшие, 16 бит нулевого регистра банка Х на младшие 16 бит нулевого регистра банка Y (это представляет собой умножение d1c0, показанное на фиг.7). Подобным же образом, третья и четвертая команды MULA соответственно представляют собой умножение d2c0 и d3c0. Как видно из фиг.7, как только эти четыре вычисления были произведены, коэффициент c0 больше не потребуется и поэтому регистр Y0.1 помечается битом пополнения, чтобы сделать возможным его перезапись другим коэффициентом (с4).

Следующие четыре команды MULA представляют собой вычисления d1c1, d2c1, d3c1 и d4c1 соответственно. Как только произведено вычисление d1cl, регистр X0.h помечается битом пополнения, так как dl больше не потребуется. Так же, как только произведены все четыре вычисления, регистр Y0.h помечается для пополнения, т.к. коэффициент с1 больше не потребуется. Подобным же образом, следующие четыре команды MULA соответствуют вычислениям d2c2, d3c2, d4c2 и d5c2, а четыре заключительных вычисления соответствуют вычислениям d3c3, d4c3, d5c3 и d6c3.

Так как в описанном выше варианте регистры не являются переопределяемыми, то каждая команда умножения должна быть точно воспроизведена с указанием конкретного требуемого регистра в операндах. Как только шестнадцать команд MULA будут выполнены, цикл команд может быть повторен для коэффициентов с с4 по с7 и элементов данных с d4 no d10. Также, в связи с тем, что цикл работает с четырьмя значениями коэффициентов за итерацию, количество значений коэффициентов должно быть кратным четырем и должен быть произведен расчет Z1 = кол-во коэффициентов/4.

При использовании механизма переопределения согласно предпочтительному варианту реализации настоящего изобретения, цикл команд может быть существенно сокращен, таким образом, что теперь будет включать только 4 команды умножения с накоплением, а не 16 команд умножения с накоплением, которые требовались в противном случае. С использованием механизма переопределения, программный код теперь может быть записан следующим образом:
; начать с 4 новыми значениями данных
ZERO (А0-А3); обнулить аккумуляторы
REPEAT Z1, X++ n4 w4 r4, Y++ n4 w4 r4 ; Z1 = (число
; коэффициентов)
; Переопределение применяется к банкам Х и Y.

; Четыре 16-битовых регистра в этих банках переопределяются.

; Указатель базы для обоих банков получает приращение на; единицу в каждой итерации цикла.

; Указатель базы разворачивается, когда достигает четвертого; регистра в банке.

MULA А0, Х0.1^, Y0.1, А0 ; а0 += d0c0, и загрузить d4
MULA A1, X0.h, Y0.1, A1 ; a1 += d1c0
MULA A2, X1.1, Y0.1, A2 ; a2 += d2c0
MULA A3, X1.h, Y0.1^, A3 ; a3 += d3c0, и загрузить с4
NEXT ; осуществлять цикл и ; продолжать переопределение
Как и прежде, первый этап - установить четыре регистра-аккумулятора А0-А3 в ноль. Затем вводится цикл команд, ограниченный кодами операций REPEAT и NEXT. Команда REPEAT имеет ряд связанных с ней параметров, которые представляют из себя следующее:
Х++: указывает, что БАЗА_ПРИР имеет значение '4' для Банка регистров Х
n4: указывает, что РЕГ_ЧИСЛО имеет - значение '4' и, следовательно, должны быть переопределены первые четыре регистра Банка X, с X0.1 no X1.h
w4: указывает, что БАЗА_РАЗВ имеет значение '4' для Банка регистров Х
r4: указывает, что РЕГ_РАЗВ имеет значение '4' для Банка регистров Х
Y++: указывает, что БАЗА_ПРИР имеет значение '4' для Банка регистров Y
n4: указывает, что РЕГ_ЧИСЛО имеет значение '4' и, следовательно, должны быть переопределены первые четыре регистра Банка Y, с Y0.1 по Y1.h
w4: указывает, что БАЗА_РАЗВ имеет значение '4' для Банка регистров Y
r4: указывает, что РЕГ_РАЗВ имеет значение '4' для Банка регистров Y
Нужно также отметить, что теперь значение Z1 равно количеству коэффициентов, а не количеству коэффициентов/4 как в примере, соответствующем известному уровню техники.

Для первой итерации цикла команд указатель базы имеет значение ноль, и, следовательно, переопределение отсутствует. Однако при следующем исполнении цикла, указатель базы будет иметь значение '1' как для банка X, так и для банка Y, и, следовательно, операнды будут отображаться следующим образом:
Х0.1 становится X0.h
X0.h становится X1.1
X1.1 становится X1.h
X1.h становится Х0.1 (так как БАЗА_РАЗВ имеет значение '4')
Y0.1 становится Y0.h
Y0.h становится Y1.l
Y1.1 становится Y1.h
Y1.h становится Y0.1 (так как БАЗА_РАЗВ имеет значение '4')
Следовательно, можно увидеть, что на второй итерации четыре команды MULA фактически производят вычисления, указанные командами MULA с пятой по восьмую в рассмотренном ранее примере, который не включает переопределение, представленное в настоящем изобретении. Подобным же образом, третья и четвертая итерации цикла производят вычисления, прежде выполнявшиеся командами MULA с девятой по двенадцатую и с тринадцатой по шестнадцатую, соответствующими программному коду, известному в данной области техники.

Следовательно, можно увидеть, что вышеописанный программный код выполняет точно тот же алгоритм фильтра блока, что и код, соответствующий известному уровню техники, но улучшает плотность кода в теле цикла на коэффициент 4, так как нужно обеспечить только четыре команды, а не шестнадцать, требуемых при существующем уровне техники.

С использованием технологии переопределения регистров согласно предпочтительным вариантам настоящего изобретения, могут быть получены следующие преимущества.

1. Она улучшает плотность кода.

2. Она может в определенных ситуациях скрыть время ожидания от момента пометки регистра как пустого до пополнения этого регистра буфером переупорядочивания Piccolo. Это могло быть достигнуто выходом из цикла, ценой увеличения размера программного кода.

3. Она делает возможным иметь доступ к переменному количеству регистров - путем изменения числа произведенных итераций цикла может изменяться число регистров, к которым произведено обращение.

4. Она может облегчить разработку алгоритмов. Для соответствующих алгоритмов программист может создать порцию кода для n-й стадии алгоритма и затем использовать переопределение регистров, чтобы применить формулу к скользящему набору данных.

Очевидно, что в описанный выше механизм переопределения регистров могут быть внесены определенные изменения, которые не будут выходить за границы области настоящего изобретения. Например, возможно, чтобы банк регистров 10 предоставлял больше физических регистров, чем может быть задано программистом в операнде команды. В то время как к этим дополнительным регистрам не может производиться обращение напрямую, механизм переопределения регистров может сделать их доступными. Например, рассмотрим пример, который мы обсудили ранее, где банк регистров Х имеет четыре доступных программисту 32-битовых регистра, и, следовательно, восемь 16-битовых регистров могут быть заданы ссылками на логические регистры. На самом деле банк регистров X может состоять из, например, шести 32-битовых регистров, в таком случае будет иметься четыре дополнительных 16-битовых регистра, которые напрямую не доступны программисту. Однако эти добавочные регистры могут быть сделаны доступными при помощи механизма переопределения, посредством чего для хранения элементов данных предоставляются дополнительные регистры.

Может быть использован следующий синтаксис ассемблера:
>> означает логический сдвиг вправо или сдвиг влево, если операнд сдвига - отрицательный (см. <масштаб> ниже).

--> означает арифметический сдвиг вправо или сдвиг влево, если операнд сдвига - отрицательный (см. <масштаб> ниже ).

ROR означает "Циклический сдвиг вправо".

SAT(а) означает насыщенное значение а (насыщенное до 16 или 32 бит в зависимости от размера регистра-приемника). То есть, чтобы насытить до 16 бит, любое значение больше чем +07fff замещается +07fff и любое значение меньше чем -08000 замещается -08000. Насыщение до 32 бит происходит подобным же образом с пределами +07ffffffff и -080000000. Если регистр-приемник является 48-битовым, насыщение остается 32-битовым.

Операнд-источник 1 может быть одного из следующих форматов:
<источник1> будет использоваться как краткое обозначение для [RnRn. 1Rn. hRn. x][^]. Другими словами, все 7 бит спецификатора источника достоверны, и регистр читается как 32-битовое значение (возможно с переставленными половинами) или 16-битовое значение с дополнением знака. Для аккумулятора читаются только нижние 32 бита. ^ задает пополнение регистра.

<источник1_16> это краткое обозначение для [Rn1Rn.h][^]. Только 16-битовые значения могут быть прочитаны.

<источник1_32> это краткое обозначение для [RnRn.x][^]. Только 32-битовые значения могут быть прочитаны, с возможно переставленными местами верхней и нижней половинами.

Операнд-источник 2 может быть одного из следующих форматов:
<источник2> будет кратким обозначением для трех вариантов:
- регистр-источник вида [RnRn.1Rn.hRn.х][^],
плюс масштаб (<масштаб>) конечного результата.

- возможно сдвинутая восьмибитовая константа <непосредственный_операнд_ 8>, но без масштаба конечного результата.

- шестибитовая константа <непосредственный операнд_ 6>, плюс масштаб (<масштаб>) конечного результата.

<источник2_ maxmin> - то же, что и <источник2>, но масштаб не допускается.

<источник2_ сдвиг> - команды сдвига предоставляют ограниченную подгруппу элементов <источник2>. Подробнее смотрите выше.

<источник2_параллельные> - так же, как для <источник2_сдвиг>
Для команд, которые задают третий операнд:
<аккумулятор> - краткое обозначение для любого из четырех регистров-аккумуляторов [А0А1А2A3]. Все 48 бит читаются. Пополнение не может быть задано.

Регистр-приемник имеет формат:
<приемник> является кратким обозначением для [RnRn.1Rn.h.1][^]. Если не добавлена ".", записывается полный регистр (48 бит в случае аккумулятора). В случае, где не требуется обратной записи в регистр, то, какой регистр используется, не имеет значения. Ассемблер поддерживает возможность опустить регистр-приемник, чтобы указать, что обратная запись не требуется или опустить ".1", чтобы указать, что обратная запись не требуется, но флаги должны быть установлены, несмотря на то, что результат - 16-битовая величина. ^ означает, что значение записывается в выходной FIFO.

<масштаб> представляет собой ряд арифметических масштабов.

Имеется четырнадцать доступных масштабов:
ASR #0, 1, 2, 3, 4, 6, 8, 10
ASR #12 по 16
LSL #1
<непосредственный_ операнд_8> означает значение 8-битового непосредственного операнда без знака. Оно представляет собой байт с циклическим сдвигом влево на 0, 8, 16 или 24. Следовательно, для любого YZ могут кодироваться значения 0YZ000000, 000YZ0000, 00000YZ00 и 0000000YZ. Циклический сдвиг кодируется как 2-битовая величина.

<непосредственный_операнд_6> означает 6-битовый непосредственный операнд без знака.

<ПАРАМЕТРЫ> используется для задания переопределения регистров и имеет следующий формат:
<БАНК><БАЗА_ПРИР>n<ПЕРЕНУМЕРАЦИЯ>w<БАЗА_РАЗВ>
<БАНК> может быть [XYZ]
<БАЗА_ПРИР> может быть [+++1+2+4]
<ПЕРЕНУМЕРАЦИЯ> может быть [0248]
<БАЗА_РАЗВ> может быть [248]
Выражение <состояние> означает любой из следующих кодов состояния. Отметим, что кодирование несколько отличается от кодирования для ARM, так как коды L3 и HI без учета знака заменены более полезными проверками знакового переполнения/исчезновения. Флаги V и N устанавливаются в Piccolo по-другому, чем в ARM, поэтому перевод проверки состояния в контроль флагов также отличается от ARM.

0000 EQ Z=0 Последний результат был нулевым
0001 NE Z=1 Последний результат был ненулевым
0010 CS C=1 Используется после операций сдвиг/МАХ
0011 СС С=0
0100 MI/LT N=1 Последний результат был отрицательным
0101 PL/GE N=0 Последний результат был положительным
0110 VS V=1 Знаковое переполнение/исчезновение на последнем результате
0111 VC V=0 Нет переполнения/исчезновения на последнем результате
1000 VP V=1 & N=0 Положительное переполнение на последнем результате
1001 VN V=1 & N=1 Отрицательное переполнение на последнем результате
1010 Зарезервировано
1011 Зарезервировано
1100 GT N=0 & Z=0
1101 LE N=1 Z=1
1110 AL
1111 Зарезервировано
Так как Piccolo имеет дело со знаковыми величинами, беззнаковые состояния LS и HI отброшены и заменены VP и VN, которые описывают направление любого переполнения. Так как результат АЛУ имеет размерность 48 бит, Ml и LT теперь выполняют одинаковую функцию, подобным же образом PL и GE. Это оставляет 3 позиции для будущего развития.

Все операции являются знаковыми, если не указано обратное.

Каждый из основных и дополнительных кодов состояния состоит из:
N - отрицательная величина.

Z - ноль.

С - перенос/беззнаковое переполнение.

V - знаковое переполнение.

Арифметические команды могут быть разделены на два типа; параллельные и "полной ширины". Команды "полной ширины" устанавливают только основные флаги, тогда как параллельные операторы устанавливают основные и дополнительные флаги, основываясь на верхней и нижней 16-битовых половинах результата.

Флаги N, Z и V вычисляются на основе полного результата АЛУ, после применения масштаба, но до записи в приемник. ASR всегда будет сокращать количество бит, требуемых для хранения результата, но ASL будет их увеличивать. Чтобы избежать этого, Piccolo будет усекать 48-битовый результат, когда применяется масштаб ASL, чтобы ограничить количество бит, выше которых должны быть выполнены обнаружение нуля и переполнение.

Флаг N вычисляется на основе предположения, что выполняется арифметика со знаком. Это связано с тем, что при возникновении переполнения, наиболее значимый бит результата представляет собой либо флаг С, либо флаг N, в зависимости от того, являются ли входные операнды знаковыми или беззнаковыми.

Флаг V указывает, произошла ли любая потеря точности в результате записи результата в выбранный приемник. Если выбран вариант отсутствия обратной записи, "размер", тем не менее, подразумевается и флаг переполнения устанавливается правильно. Переполнение может произойти, когда:
- происходит запись в 16-битовый регистр, при этом результат не находится в диапазоне от -2^5 до 2^15-1;
- происходит запись в 32-битовый регистр, при этом результат не находится в диапазоне от -2^1 до 2^31-1.

Команды параллельного сложения/вычитания устанавливают флаги N, Z и V независимо по верхней и нижней половинам результата.

При записи в аккумулятор флаг V устанавливается так же, как и при записи в 32-битовый регистр. Это позволяет командам насыщения использовать аккумуляторы как 32-битовые регистры.

Команда насыщения абсолютного значения (SABS) также устанавливает флаг переполнения, если абсолютное значение входного операнда не поместится в предназначенный приемник.

Флаг Перенос устанавливается командами сложения и вычитания и используется как "двоичный" флаг командами MAX/MIN, SABS и CLB. Все другие команды, включая операцию умножения, оставляют без изменения флаг(и) Переноса.

Для операций сложения и вычитания Перенос такой, какой создается либо битом 31, либо битом 15, либо результатом, в зависимости от того, является ли приемник 32- или 16-битовым.

Стандартные арифметические команды могут быть разделены на ряд типов, в зависимости от того, как устанавливаются флаги:
В случае команд Сложение и Вычитание, если установлен бит N, то все флаги остаются без изменения. Если бит N не установлен, то флаги обновляются следующим образом:
Z устанавливается, если полный 48-битовый результат был 0.

N устанавливается, если полный 48-битовый результат имел установленный бит 47 (был отрицательным).

V устанавливается, если: либо регистр-приемник является 16-битовым и результат со знаком не поместится в 16-битовый регистр (не в диапазоне -2^ 15<= x<2^ 15), либо регистр-приемник является 32/48-битовым и результат со знаком не поместится в 32 бита.

Если <приемник> является 32- или 48-битовым регистром, тогда флаг С устанавливается, если имеется перенос из 31 бита при суммировании <источник1> и <источник2> или, если не происходит заема из бита 31 при вычитании <источник2> из <источник1> (того же результата вы могли ожидать на ARM). Если <приемник> - 16-битовый регистр, то флаг С устанавливается, если имеется перенос из бита 15 суммы.

Дополнительные флаги (SZ, SN, SV, SC) остаются без изменения.

В случае команд, которые либо выполняют умножение, либо производят накопление из 48-битового регистра.

Z устанавливается, если полный 48-битовый результат был 0.

N устанавливается, если полный 48-битовый результат имел установленный бит 47 (был отрицательным).

V устанавливается, если (1) либо регистр-приемник является 16-битовым и результат со знаком не поместится в 16-битовый регистр (не в диапазоне 2^ 15<-x<2^15), либо (2) регистр-приемник является 32/48-битовым и результат со знаком не поместится в 32 бита.

С остается без изменения.

Дополнительные флаги (SZ, SN, SV, SC) остаются без изменения.

Другие команды, включая логические операции, параллельные сложения и вычитания, максимум и минимум, сдвиги и т.д. рассматриваются ниже.

Команды Сложение и Вычитание складывают или вычитают два регистра, масштабируют результат и затем сохраняют его обратно в регистр. Операнды обрабатываются как знаковые величины. Обновление флагов для ненасыщающих вариантов не обязательно и может быть подавлено добавлением N в конец команды (см. табл.35).

КОП задает тип команды.

Действие (КОП):
100N0 приемник = (источник1 + источник2) (->> масштаб) (,N)
110N0 приемник = (источник1+ источник2) (->> масштаб) (,N)
10001 приемник = SAT ((источник1 + источник2) (->> масштаб))
11001 приемник = SAT ((источник1 - источник2) (->> масштаб))
01110 приемник = (источник2 - источник1) (->> масштаб)
01111 приемник = SАТ((источник2 - источник1) (->> масштаб))
101N0 приемник = (источник1 + источник2 + Перенос) (->> масштаб) (,N)
111N0 приемник = (источник1 - источник2 + Перенос - 1) (->> масштаб) (, N)
Мнемоника:
100N0 ADD{N} <приемник>, <источник 1>, <источник 2> {,<масштаб>}
110N0 SUB{N} <приемник>, <источник 1>, <источник 2> {,<масштаб>}
10001 SADD <приемник>, <источник 1>, <источник 2> {,<масштаб>}
11001 SSUB <приемник>, <источник 1>, <источник 2> {,<масштаб>}
01110 RSB <приемник>, <источник 1>, <источник 2> {,<масштаб>}
01111 SRSB <приемник>, <источник 1>, <источник 2> {,<масштаб>}
101N0 ADC{N} <приемник>, <источник 1>, <источник 2> {,<масштаб>}
111N0 SBC{N} <приемник>, <источник 1>, <источник 2> {,<масштаб>}
Ассемблер поддерживает следующие коды операций
СМР <источник1>, <источник2>
CMN <источник1>, <источник2>
СМР - это вычитание, которое устанавливает флаги с отключением записи в регистр. CMN - это сложение, которое устанавливает флаги с отключением записи в регистр.

Флаги:
Были рассмотрены выше.

Причины для включения:
ADC полезна для вставки переноса на дно регистра, вслед за операцией Сдвиг/MAX/MIN. Она также используется для осуществления деления 32/32 бита. Она также обеспечивает сложение повышенной точности. Добавление бита N дает более точный контроль флагов, в частности переноса. Это делает возможным деление 32/32 бита при 2 тактах на бит.

Насыщенные сложения и вычитания нужны для G.729 и т.д.

Счетчики увеличения/уменьшения. RSB полезна для вычисления сдвигов (x= 32-x является обычной операцией). Насыщенная RSB нужна для насыщенного отрицания (используется в G.729).

Команды "Сложение/вычитание с накоплением" производят сложение и вычитание с накоплением и масштабирование/насыщение. В отличие от команд умножения с накоплением, номер аккумулятора не может быть задан независимо от регистра-приемника. Нижние два бита регистра-приемника дают номер, "аккумулятор", 48-битового аккумулятора для накопления. Следовательно, ADDA Х0, Х1, Х2,А0 и ADDA A3,X1,Х2,A3 являются разрешенными, a ADDA X1,X1,X2,A0 - нет. С этим классом команд результат должен быть записан обратно в регистр - кодирование "нет обратной записи" поля приемника не допускается (см. табл. 36).

КОП задает тип команды. Далее "аккумулятор" представляет собой (приемник[1:0] ). Бит "Не" указывает насыщение.

Действие (КОП):
0 приемник = {SAT} (аккумулятор + (источник1 + источник2)) {->> масштаб}
1 приемник = {SAT} (аккумулятор + (источник1 источник2)) {->> масштаб}
Мнемоника:
0 { S} ADDA <приемник>, <источник1>, <источник2>, <аккумулятор> {, <масштаб>}
1 { S} SUBA <приемник>, <источник1>, <источник2>, <аккумулятор> {, <масштаб>}
S перед командой указывает насыщение.

Флаги:
См. выше.

Причины для включения:
Команда ADDA (сложение с накоплением) полезна для суммирования двух слов из массива целых чисел с аккумулятором (например, чтобы найти их среднее) за один такт. Команда SUBA (вычитание с накоплением) полезна в вычислении суммы разностей (для корреляции); она производит операцию вычитания над двумя отдельными значениями и добавляет разницу в третий регистр. Сложение с округлением может быть сделано при использовании <приемник>, отличного от <аккумулятор>. Например, Х0= (X1+X2-16384)>>15 может быть сделано в одном такте при хранении 16384 в А0. Сложение с константой округления может быть сделано при помощи ADDA Х0,X1,#16384, А0.

Для реализации с точностью до бита следующего:
сумма ((а_i b_i)>>k) (достаточно обычно - используется в TrueSpeech)
стандартный код Piccolo был бы:
MUL t1, a_0, b_0, ASR#k
ADD ans, ans, t1
MUL t2, a_1, b 1, ASR#k
ADD ans, ans, t2
С этим кодом существуют две проблемы: он слишком длинный и сложения не дают 48-битовой точности, поэтому биты защиты не могут быть использованы. Лучшее решение - использовать ADDA:
MUL t1, а_0, b 0, ASR#k
MU1 t2, а_1, b 1, ASR#k
ADDA ans, t1, t2, ans
Это дает 25% увеличение скорости и сохраняет 48-битовую точность.

Сложение/Вычитание в Параллельных командах производит сложение и вычитание на двух знаковых 16-битовых величинах, хранящихся в парах в 32-битовых регистрах. Основные флаги кодов состояния устанавливаются от результата наиболее значимых 16 бит, дополнительные флаги обновляются от наименее значимой половины. В качестве источников для этих команд могут быть заданы только 32-битовые регистры, хотя в значениях полуслова могут быть переставлены местами. Индивидуальные половины каждого регистра обрабатываются как знаковые значения. Вычисления и масштабирование производятся без потери точности. Следовательно, ADDADD Х0, X1, Х2, ASR#1 создаст корректные средние в верхней и нижней половинах Х0. Возможное насыщение обеспечивается для каждой команды, для которой должен быть установлен бит Нс (см. табл.37).

КОП указывает операцию.

Действие (КОП):
000 приемник.h = (источник1.h + источник2.h) {->> масштаб},
приемник.1 = (источник1.1 + источник2.1) {->> масштаб},
001 приемник-h = (источник1.h + источник2.h) {->> масштаб},
приемник.1 = (источник 1.1 - источник2.1) {->> масштаб},
100 приемник.h = (источник1.h - источник2.h) {->> масштаб},
приемник.1 = (источник1.1 + источник2.1) {->> масштаб},
101 приемник.h = (источник1.h - источник2.h) {->> масштаб},
приемник.1 = (источник1.1 - источник2.1) {->> масштаб},
Каждая сумма/разность независимо насыщается, если установлен бит Нc.

Мнемоника:
000 {S}ADDADD <приемник>, <источник1_32>, <источник2_32> {,<масштаб>}
001 {S}ADDSUD <приемник>, <источник1_32>, <источник2_32> {,<масштаб>}
100 {S}SUBADD <приемник>, <источник1_32>, <источник2_32> {,<масштаб>}
101 {S}SUBSUB <приемник>, <источннк1_32>, <источник2_32>{,<масштаб>}
S перед командой указывает насыщение.

Ассемблер также поддерживает
CMNCMN <приемник>, <источник1_32>, <источник2_32> {,<масштаб>}
CMNCMP <приемник>, <источник1_32>, <источник2_32> {,<масштаб>}
CMPCMN <приемник>, <источник 1_32>, <источник2_32> {,<масштаб>}
СМРСМР <приемник>, <источник1_32>, <источник2_32> {,<масштаб>}
созданные стандартными командами с отсутствием обратной записи.

Флаги:
С устанавливается, если имеется перенос из бита 15, при сложении двух верхних шестнадцатибитовых половин.

Z устанавливается, если сумма верхних шестнадцатибитовых половин равна 0.

N устанавливается, если сумма верхних шестнадцатибитовых половин отрицательная.

V устанавливается, если 17-битовая сумма со знаком верхних шестнадцатибитовых половин не поместится в 16 бит (последующий масштаб).

SZ, SN, SV и SC устанавливаются подобным образом для нижних 16-битовых половин.

Причина для включения:
Параллельные команды Сложение и Вычитание полезны для выполнения операций над комплексными числами, хранящимися в одном 32-битовом регистре. Они используются в FFT kernel, (алгоритм БПФ - быстрого преобразования Фурье). Они также полезны для простых сложений/вычитании векторов 16-битовых данных, позволяя двум элементам обрабатываться за один такт.

Команда Переход (условный) разрешает изменения по состоянию в потоке управления. Piccolo может затратить три такта на выполнение полученного перехода (см. табл.38).

Действие:
Переход на смещение, если <состояние> сохраняется согласно основным флагам.

Смещение является 16-битовым количеством слов со знаком. На данный момент диапазон смещений ограничивается от -32768 до +32767 слов.

Произведенное вычисление адреса:
Адрес места назначения = адрес команды перехода + 4 + СМЕЩЕНИЕ
Мнемоника:
В<состояние> <метка_назначения>
Флаги:
Не затрагиваются.

Причины для включения:
В высшей степени полезна в большинстве процедур.

Команды "Условное Сложение или Вычитание" в зависимости от состояния прибавляют или отнимают источник2 от источник1 (см. табл.39).

КОП задает тип команды.

Действие (КОП):
0 если(перенос установлен) tеmр=источник1-источник2
иначе tеmр=источник1+источник2
приемник=tеmр {->> масштаб}
1 если(перенос установлен) tеmр=источник1-источник2
иначе temр=источник1+источник2
приемник= temр {->> масштаб} НО если масштаб является сдвигом влево, тогда новое значение переноса (от источник 1-источник2 или источник 1+источник2) сдвигается к дну.

Мнемоника:
0 CAS <приемник>, <источник1>, <источник2> {,<масштаб>}
1 CASC <приемник>, <источник1>, <источник2> {,<масштаб>}
Флаги:
См выше.

Причины для включения:
Команды Условное Сложение или Вычитание позволяют составить эффективный программный код операции деления.

Пример 1. Разделить 32-битовое значение без знака в Х0 на 16-битовое значение без знака в X1 (предполагая, что Х0< (Х1<<16) и X1.h=0).

LSL X1,X1,#15; сдвинуть вверх делитель
SUB X1,X1,#0; установить флаг переноса
REPEAT # 16
CASC X0,X0,X1,LSL#1
NEXT
В конце цикла Х0.1 содержит частное от деления. Остаток может быть извлечен из X0.h в зависимости от значения переноса.

Пример 2. Разделить 32-битовое положительное значение в Х0 на 32-битовое положительное значение в XI, с досрочным прекращением.

MOV Х2,#0; очистить частное
LOG Z0,X0; число бит, на которые может быть сдвинут Х0
LOG Z1,X1; число бит, на которые может быть сдвинут X1
SUBS Z0,Z1,Z0; X1 сдвинут вверх так, что единицы совпадают
BLT div_end; Х1>Х0, тогда ответ 0
LSL X1,X1,Z0; подобрать ведущие
ADD Z0,Z0,#1; число проверок, которые нужно сделать
SUBS Z0,ZU,#0; установить перенос
REPEAT Z0
CAS Х0,Х0,Х1,LSL#1
ADCN Х2,Х2,Х2
NEXT
div_end
По окончании Х2 содержит частное, а остаток может быть извлечен из Х0.

Команда "Подсчет ведущих битов" позволяет нормализовать данные (см. табл.40).

Действие:
Приемник устанавливается равным числу мест, на которые значение в источник1 должно быть сдвинуто влево для того, чтобы бит 31 отличался от бита 30. Это значение находится в диапазоне 0-30, за исключением особых случаев, где источник1 либо -1, либо 0, при этом возвращается 31.

Мнемоника:
CLB <приемник>, <источник1>
Флаги:
Z устанавливается, если результат 0.

N очищается.

С устанавливается, если источник 1 либо -1, либо 0.

V остается без изменения.

Причины для включения:
Нужен этап нормализации.

Команды Останов и Прерывание обеспечиваются для остановки исполнения Piccolo (см. табл.41).

КОП задает тип команды.

Действие (КОП):
0 Piccolo прекращает исполнение, и в регистре состояния Piccolo устанавливается бит Останов.

1 Piccolo прекращает исполнение, и в регистре состояния Piccolo устанавливается бит Прерывание, и в ARM происходит прерывание для сообщения, что достигнута точка прерывания.

Мнемоника:
0 HALT
1 BREAK
Флаги:
Не затрагиваются.

Команды "Логическая операция" производят логическую операцию над 32- или 16-битовым регистром. Операнды обрабатываются как значения без знака (см. табл.42).

КОП кодирует логическую операцию, которую нужно выполнить.

Действие (КОП):
00 приемник = (источник1 & источник2) {->> масштаб}
01 приемник = (источник1 источник2) {->> масштаб}
10 приемник = (источник1 & -источник2) {->> масштаб}
11 приемник = (источник1 ^ источник2) {->> масштаб}
Мнемоника:
00 AND <приемник>, <источник1>, <источник2> {, <масштаб>}
01 ORR <приемник>, <источник1>, <источник2> {, <масштаб>}
10 BIC <приемник>, <источник1>, <источник2> {, <масштаб>}
11 EOR <приемник>, <источник1>, <источник2> {, <масштаб>}
Ассемблер поддерживает следующие коды операций:
TST <источник1>, <источник2>
TEQ <источник1>, <источник2>
TST - это AND с отключением записи в регистр. TEQ - это EOR с отключением записи в регистр.

Флаги:
Z устанавливается, если результат все нули
N, С, V остаются без изменения
SZ, SN, SC, SV остаются без изменения
Причины для включения:
Алгоритмы сжатия речи используют упакованные битовые поля для кодирования информации. Команды маскирования битов помогают в извлечении/упаковке этих полей.

Команды "Операции Мах и Min" производят операции максимума и минимума (см. табл.43).

КОП задает тип команды.

Действие (КОП):
0 приемник = (источник1 <= источник2) ? источник1: источник2
1 приемник = (источник1 > источник2) ? источник1: источник2
Мнемоника:
0 MIN <приемник>, <источник1>, <источник2>
1 МАХ <приемник>, <источник1>, <источник2>
Флаги:
Z устанавливается, если результат нулевой
N устанавливается, если результат отрицательный
С Для Мах: С устанавливается, если источник2>=источник1 (случай приемник=источник1)
Для Min: С устанавливается, если источник2>=источник1 (случай приемник= источник2)
V остается без изменения.

Для того чтобы найти уровень сигнала, многие алгоритмы сканируют образец, чтобы найти минимум/максимум абсолютного значения образцов. Операции МАХ и MIN в этом случае являются бесценными. В зависимости от того, желаете ли вы найти первый или последний максимум в сигнале, операнды источник1 и источник2 могут переставляться местами.

МАХ Х0, Х0, #0 будет преобразовывать Х0 в положительное число с отсечением снизу.

MIN X0, Х0, #255 будет отсекать Х0 выше. Это полезно для обработки графики.

Операции Мах и Min в Параллельных командах производят операции максимума и минимума на параллельных 16-битовых данных (см. табл.44).

КОП задает тип команды.

Действие (КОП):
0 приемник.1 = (источник1.l <= источник2.l) ? источник1.1: источник2.1
приемник, h = (источник1.h <=- источник2.h) ? источник1.h: источник2.h
1 приемник.l (источник1.l > источник2.l)? источник 1.1: источник2.1
приемник.h- (источник1.h > источник2.h) ? источник1.h: источник2.h
Мнемоника:
0 MINMIN <приемник>, <источник1>, <источннк2>
1 МАХМАХ <приемник>, < источник 1>. -источник2
Флаги:
Z устанавливается, если верхние 16 бит результата нулевые
N устанавливается, если верхние 16 бит результата отрицательные
С Для Мах: С устанавливается, если источник2.h=-источник1.h (случай приемник-источник1)
Для Min: С устанавливается, если источник2. h>=источник1.h (случай приемник=источник2)
V остается без изменения
SZ, SN, SC, SV устанавливаются подобным образом для нижних 16-битовых половин.

Причины для включения:
Те же, что и для Мах и Min.

Команды "Операция пересылки длинного непосредственного операнда" позволяют устанавливать в регистре любое знаковое 16-битовое значение с дополнением знака. Две из этих команд могут устанавливать в регистр любое значение (при обращении последовательно к старшей и младшей половине). Для пересылок между регистрами, смотрите операции выбора (см. табл.45).

Мнемоника:
MOV <приемник>, #<непосредственный_операнд_16>
Ассемблер предоставит операцию NОР без блокировки, использующую эту команду MOV, т.е. NОР эквивалентна MOV, #0.

Флаги:
Флаги не затрагиваются.

Причины для включения:
Инициализация регистров/счетчиков.

Команды "Операция умножения с накоплением" производят знаковое умножение с накоплением или сбросом, масштабирование и насыщение (см. табл.46).

Поле КОП задает тип команды.

Действие (КОП):
00 приемник = (аккумулятор + (источник1 источник2)) {->> масштаб}
01 приемник = (аккумулятор - (источник1 источник2)) {->> масштаб}
В любом случае, результат насыщается перед записью в приемник, если установлен бит "Нc".

Мнемоника:
00 {S}MULA <приемник>, <источник1_16>, <источник2_16>, <аккумулятор> {, <масштаб>}
01 {S}MULS <источник>, <источник1_16>, <источник2_16>, <аккумулятор> {, <масштаб>}
S перед командой указывает насыщение.

Флаги:
См. раздел выше.

Причины для включения:
MULA длительностью в один такт требуется для программного кода КИХ (конечной импульсной характеристики). MULS используется в FFT butterfly (алгоритм БПФ). MULA также полезна для умножения с округлением. Например, А0= (Х0Х1+16384)>>15 может быть сделана за один такт при хранении 16384 в другом аккумуляторе (А1, например). Различающиеся <приемник> и <аккумулятор> также требуются для FFT kernel.

Команды "Операция умножения с удвоением" производят умножение со знаком, удваивая результат перед накоплением или сбросом, масштабированием и насыщением (см. табл.47).

КОП задает тип команды.

Действие (КОП):
0 приемник = SАТ((аккумулятор + SАТ(2источник1источник2)) {->>масштаб}
1 приемник = SАТ((аккумулятор - SАТ(2источник1 источник2)) { ->>масштаб}
Мнемоника:
0 SMLDA <приемник>, <источник1_ 16>, <источник2_16>, <аккумулятор> {, <масштаб>}
1 SMLDS <приемник>, <источник1_ 16>, <источник2_16>, <аккумулятор> {, <масштаб>}
Флаги:
См. раздел выше.

Причины для включения:
Команда MLD требуется для G.729 и других алгоритмов, которые используют арифметику дробных чисел. Большинство систем ЦОС обеспечивают дробный режим, который делает возможным левый сдвиг одного бита на выходе умножителя, перед накоплением или обратной записью. Поддержка этой операции как отдельной команды обеспечивает большую гибкость программирования. Имена команд, эквивалентных для некоторых основных операций серии G:
L_msu => SMLDS
L_mac => SMLDA
Эти операции заставляют использовать насыщение умножителя при левом сдвиге на один бит. Если требуется последовательность дробных умножений-накоплений, без потери точности, может быть использована MULA, с поддержанием суммы в формате 33.14. Если требуется, в конце могут быть осуществлены левый сдвиг и насыщение для преобразования к формату 1.15.

Команды "Операция умножения" производят умножение со знаком и возможное масштабирование/насыщение. Регистры-источники (только 16-битовые) обрабатываются как числа со знаком (см. табл.48).

КОП задает тип команды.

Действие (КОП):
0 приемник = (источник1источник2) {->>масштаб}
1 приемник = SАТ((источник1источник2) {->>масштаб})
Мнемоника:
0 MUL <приемник>, <источник1_16>, <источник2>, {, <масштаб>}
1 SMUL <приемник>, <источник1_16>, <источник2>, {, <масштаб>}
Флаги:
См. раздел выше.

Причины для включения:
Знаковые и насыщенные умножения требуются многими процессами.

"Операции со списком регистров" используются для выполнения действий над набором регистров. Для сбрасывания выбора регистров до или в промежутках между процедурами предоставляются команды Очистка и Обнуление. Команда Вывод обеспечивается для сохранения содержимого списка регистров в выходной FIFO (см. табл.49).

КОП задает тип команды.

Действие (КОП):
000 для(k=0; k<16; k++)
если бит k списка регистров установлен, то регистр k помечается как пустой.

001 для(k-0; k<16; k++)
если бит k списка регистров установлен, то регистр k устанавливается в 0.

010 Не определена
011 Не определена
100 для (k=0;k<16;k++)

101 для(k-0;k<16;k++)

110 для(k-0; k<16; k++)
если бит k списка реестров установлен, то SАТ(регистр k ->> масштаб) записывается в выходной FIFO.

111 для (k=0;k<16;k++)

Мнемоника:
000 EMPTY <список регистров>
001 ZERO <список регистров>
010 Не используется
011 He используется
100 OUTPUT <список_регистров> (,<масштаб-}
110 SOUTPUT <список_регистров> (,<масштаб>}
111 SOUTPUT <список_регистров> (,<масштаб>}
Флаги:
Не затрагиваются.

Примеры:
EMPTY {А0, A1, Х0-Х3}
ZERO {Y0-Y3}
OUTPUT {X0-Y1}^
Ассемблер будет также поддерживать синтаксис
OUTPUT Rn
В таком случае он подаст на выход один регистр, используя команду MOV ^, Rn.

Команда EMPTY не сможет выполнить соответствующие действия до тех пор, пока все регистры, которые должны быть очищены, содержат достоверные данные (т.е. не пустые),
Операции со списком регистров не должны использоваться внутри циклов REPEAT, производящих переопределение.

Команда OUTPUT может задавать для вывода только не более восьми регистров.

Причины для включения:
После того как процедура закончена, следующая процедура ожидает, чтобы все регистры стали пустыми, и она смогла бы принимать данные от ARM. Чтобы выполнить это, требуется команда EMPTY. Перед выполнением FIR или другого фильтра, все аккумуляторы и частичные результаты необходимо обнулить. В этом помогает команда ZERO. Обе команды разработаны, чтобы улучшить плотность кода путем замещения серии отдельных регистровых пересылок. Команда OUTPUT включена для улучшения плотности кода путем замещения серии команд MOV^, Rn.

Команда "Пересылка параметра переопределения" RMOV предоставляется для возможности конфигурации определяемых пользователем параметров переопределения регистров.

Кодирование команды представлено в табл.50.

Каждое поле ПАРАМЕТРЫ включает входы, представленные в табл.51.

Значение этих входов описано в табл.52.

Мнемоника:
RMOV <ПАРАМЕТРЫ>,[<ПАРАМЕТРЫ>]
Поле ПАРАМЕТРЫ имеет следующий формат:
<ПАРАМЕТРЫ>::= <БАНК><БАЗА_ПРИР>n<ПЕРЕНУМЕРАЦИЯ>w<БАЗА_РАЗВ>
<БАНК>::= [XYZ]
<БАЗА_ПРИР::=- [+++1+2+4]
<ПЕРЕНУМЕРАЦИЯ>::=[0248]
<БАЗА_РАЗВ>::= [248]
Если команда RMOV используется в то время, как активно переопределение, характер выполнения НЕПРЕДСКАЗУЕМЫЙ.

Флаги:
Не затрагиваются.

Команды "Повторение" обеспечивают четыре цикла с нулевым тактом в аппаратном средстве. Команда REPEAT определяет новый аппаратный цикл. Piccolo использует аппаратный цикл 0 для первой команды REPEAT, аппаратный цикл 1 для команды REPEAT, вложенной в первую команду повторения и так далее. Команде REPEAT не нужно задавать, какой цикл используется. Циклы REPEAT строго должны быть вложенными. Если предпринимается попытка сделать вложенность циклов более 4, то характер выполнения непредсказуем.

Каждая команда REPEAT задает количество команд в цикле (который непосредственно следует за командой REPEAT) и количество раз прохождения цикла (которое либо константа, либо считано из регистра Pi.cco.lo).

Если количество команд в цикле мало (1 или 2), то Piccolo могут потребоваться дополнительные такты для настройки цикла.

Если количество циклов задается в регистре, подразумевается 32-битовый доступ (Р1= 1), хотя только нижние 16 бит являются значимыми и число рассматривается как беззнаковое. Если количество циклов нулевое, то действие цикла не определено. Берется копия количества циклов, поэтому регистр может быть сразу же повторно использован (или даже пополнен) без воздействия на цикл.

Команда REPEAT обеспечивает механизм модификации способа, которым операнды-регистры задаются в цикле. Подробности описаны выше.

Кодирование REPEAT с заданным в регистре количеством циклов представлено в табл.53.

Кодирование REPEAT с фиксированным количеством циклов представлено в табл.54.

Операнд П_ ПОЛЕ_4 задает, какую из 16 конфигураций параметров переопределения использовать внутри цикла (см. табл.55).

Ассемблер предоставляет два кода операции, REPEAT и NEXT, для определения аппаратного цикла. REPEAT идет в начале цикла, и NEXT ограничивает конец цикла, давая возможность ассемблеру вычислить число команд в теле цикла. Для REPEAT необходимо задать только число циклов как константу или регистр. Например:
REPEAT Х0
MULA А0, Y0.1, Z0.1, А0
MULA А0, Y0.h^, Z0.h^, А0
NEXT
Это выполнит две команды MULA Х0 раз. Также,
REPEAT # 10
MULA А0, Х0^, Y0^ А0
NEXT
произведет 10 умножений с накоплением.

Ассемблер поддерживает синтаксис:
REPEAT #итерации [,<ПАРАМЕТРЫ>]
чтобы задать параметры переопределения, которые используются для REPEAT. Если требуемые параметры переопределения равны одному из предварительно определенных наборов параметров, то используется соответствующее кодирование REPEAT. Если нет, то ассемблер создаст команду RMOV, чтобы загрузить параметры, определенные пользователем, которая будет идти непосредственно перед командой REPEAT. Для подробностей по команде RMOV и формату параметров переопределения, смотрите раздел выше.

Если число итераций для цикла равно нулю, то действие REPEAT НЕПРЕДСКАЗУЕМО.

Если поле "Количество команд" установлено в 0, то действие REPEAT НЕПРЕДСКАЗУЕМО.

Цикл, состоящий только из одной команды, если эта команда является переходом, будет иметь НЕПРЕДСКАЗУЕМЫЙ характер поведения.

Команды перехода в границах цикла REPEAT, которые приводят к переходу вне границ этого цикла, являются НЕПРЕДСКАЗУЕМЫМИ.

Команда "Насыщение абсолютного значения" вычисляет насыщенное абсолютное значение источника 1 (см. табл.56).

Действие:
приемник = SAT ((источник1 >= 0) ? источник1: -источник1). Значение всегда насыщенное. В частности, абсолютное значение 080000000 равно 07fffffff и НЕ 080000000!
Мнемоника:
SABS <приемник>, <источник1>
Флаги:
Z устанавливается, если результат нулевой.

N остается без изменений.

С устанавливается от источник1<0 (случай приемник = -источник1).

V устанавливается, если произошло насыщение.

Причины для включения:
Полезна для многих применений ЦОС.

Операции "Выбор (Условные пересылки)" служат для пересылки в зависимости от состояния либо источника 1, либо источника 2 в регистр-приемник. Выбор всегда эквивалентен пересылке. Имеются также параллельные операции для использования после параллельного сложения/вычитания.

Заметьте, что, по причинам, заложенным в данной разработке, оба операнда-источника могут быть считаны командой, поэтому, если хотя бы один пуст, команда остановится, без учета того, действительно ли требуется операнд (см. табл.57).

КОП задает тип команды.

Действие (КОП):
00 если <состояние> сохраняется для основных флагов то приемник=источник1 иначе приемник =источник2
01 если <состояние> сохраняется для основных флагов то приемник.h.=источник1.h иначе приемник.h=источник2.h
если <состояние> сохраняется для доп-ных флагов то приемник.1=источник1.1 иначе приемник. 1=источник2.1
10 если <состояние> сохраняется для основных флагов то приемник.h=источник.1h иначе приемник.h= источник2.h
если <состояние> нарушается для доп-ных флагов то приемник.1=источник1.1 иначе приемник.1=источник2.1
11 Зарезервировано
Мнемоника:
00 SЕL<состояние> <приемник>, <источник1>, <источник2>
01 SЕLTТ<состояние> <приемник>, <источник1>, <источник2>
10 SЕLTF<состояние> <приемник>, <источник1>, <источник2>
11 Не используется
Если регистр помечается для пополнения, он, безусловно, пополняется. Ассемблер также обеспечивает мнемонику:
МОV<состояние> <приемник>, <источник1>
SELFT<состояние> <приемник>, <источник1>, <источник2>
SELFF<состояние> <приемник>, <источник1>, <источник2> МОV<состояние>, А, В эквивалентно SЕL<состояние> А, В, А. SELFT и SELFF получаются перестановкой источник1 и источник2 и использованием SELTF и SELTT.

Флаги:
Все флаги остаются без изменения, так что может быть произведена последовательность выборов.

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

Команды "Операции сдвига" обеспечивают левые или правые логические сдвиги, правые арифметические сдвиги и циклические сдвиги на заданную величину. Предполагается, что величина сдвига представляет собой целое число со знаком между -128 и +127, взятое из нижних 8 бит содержимого регистра или непосредственный операнд в диапазоне от +1 до +31. Сдвиг на отрицательную величину вызывает сдвиг в противоположном направлении на ABS (величина сдвига).

Входные операнды расширены дополнением знака до 32 бит; результирующий 32-битовый выход расширен дополнением знака до 48-бит перед обратной записью, так что запись в 48-битовый регистр сохраняет точность (см. табл.58).

КОП задает тип команды.

Действие (КОП):
00 приемник - (источник2>= 0) ? источник1 << источннк2: источник1 >> -источник2
01 приемник - (источник2 >= 0) ? источник1 >> источник2: источник1 << -источник2
10 приемник = (источник2 >= 0) ? источник1 >> источник2: источник1 <<-источник2
Мнемоника:
00 LSL <приемник>, <источник1>, <источник2_16>
01 LSR <приемник>, <источник1>, <источник2_16>
10 ASR <приемник>, <источник1>, <источник2_16>
11 ROR <приемник>, <источник1>, <источник2_16>
Флаги:
Z устанавливается, если результат нулевой
N устанавливается, если результат отрицательный
V остается без изменения
С устанавливается в значение последнего выдвинутого бита (как на ARM)
Поведение сдвигов, заданных регистрами:
- LSL на 32 имеет результат ноль, С устанавливается равным биту 0 источника 1.

- LSL на более чем 32 имеет результат ноль, С устанавливается равным нулю.

- LSR на 32 имеет результат ноль, С устанавливается равным биту 31 источника 1.

- LSR на более чем 32 имеет результат ноль, С устанавливается равным нулю.

- ASR на 32 или более имеет результат, заполненный битом 31 источника 1, и С устанавливается равным этому биту.

- ROR на 32 имеет результат, равный источнику 1, и С устанавливается равным биту 31 источника 1.

- ROR на n, где n больше чем 32, даст тот же результат и перенос, что и ROR на n-32;
следовательно, неоднократно вычитайте 32 из n до тех пор, пока величина не будет находиться в диапазоне от 1 до 32 и смотрите выше.

Причины для включения:
Умножение/деление со степенью 2. Извлечение битов и полей. Последовательные регистры.

Команды "Неопределенная" приведены выше в списке набора команд. Их исполнение заставит Piccolo остановить исполнение, установить бит U в регистре состояния и отключить себя (как если бы был очищен бит Е в регистре управления). Это позволяет включать любые будущие дополнения команд и дает возможность их эмулирования в существующих разработках.

Доступ к Состоянию Piccolo из ARM является следующим.

Режим доступа к состоянию используется для отслеживания/модификации состояния Piccolo. Этот механизм предоставляется с двумя целями:
- Контекстное переключение.

- Отладка.

Piccolo переводится в режим доступа к состоянию выполнением команды PSTATE. Этот режим позволяет полностью сохранять и восстанавливать состояние Piccolo последовательностью команд STC и LDC. При переводе в режим доступа к состоянию, использование ID PICCOLO 1, идентификационного номера Piccolo как сопроцессора, модифицируется, чтобы разрешить доступ к состоянию Piccolo. Имеется 7 банков состояния Piccolo. Все данные в отдельном банке могут быть загружены и сохранены одной командой LDC или STC.

Банк 0: Личные регистры.

- 1 32-битовое слово, содержащее значение Регистра ID Piccolo (Только чтение).

- 1 32-битовое слово, содержащее состояние Регистра Управления.

- 1 3.2-битовое слово, содержащее состояние Регистра состояния.

- 1 32-битовое слово, содержащее состояние Счетчика команд.

Банк 1: Регистры общего назначения (РОН).

- 1.6 32-битовых слов, содержащих состояние регистров общего назначения.

Банк 2: Аккумуляторы.

- 4 32-битовых слова, содержащих верхние 32-битовые части регистров-аккумуляторов (Обратите особое внимание, что дублирование состояния РОН необходимо для целей восстановления - в противном случае подразумевалась бы еще одна запись в банк регистров).

Банк 3: Состояние Регистры/ БП Piccolo / Выходной FIFO.

- 1 32-битовое слово, указывающее, какие регистры Piccolo помечены для пополнения (2 бита для каждого 32-битового регистра)
- 8 32-битовых слов, содержащих состояние признаков БП (8 7-битовых элементов, сохраненных в битах с 7 по 0).

- 3 32-битовых слова, содержащих состояние невыровненных регистров-защелок БП (биты с 17 по 0).

- 1 32-битовое слово, указывающее, какие позиции в выходном сдвиговом регистре содержат достоверные данные (бит 4 указывает "пусто", биты с 3 по 0 кодируют количество, использованных вводов).

- 1 32-битовое слово, содержащее состояние хранящего регистра-защелки выходного FIFO (биты с 17 по 0).

Банк 4: Входные данные БП.

- 8 32-битовых значений данных.

Банк 5: Выходные данные FIFO.

- 8 32-битовых значений данных.

Банк 6: Аппаратное средство осуществления циклов.

- 4 32-битовых слова, содержащих начальные адреса циклов.

- 4 32-битовых слова, содержащих конечные адреса циклов.

- 4 32-битовых слова, содержащих число циклов (биты с 15 по 0).

- 1 32-битовое слово, содержащее определенные пользователем параметры переопределения и другие параметры состояния переопределения.

Команда LDC используется для загрузки состояния Piccolo, когда Piccolo находится в режиме доступа к состоянию. Поле БАНК задает, какой банк загружается (см. табл.59).

Следующая последовательность будет загружать полное состояние Piccolo с адреса в регистре R0.

LDP В0, [R0], #16 !; личные регистры
LDP B1, [R0], #64 !; загрузить регистры общего назначения
LDP B2, [R0], #16 !; загрузить аккумуляторы
LDP B3, [R0], #56 !; загрузить состояние Pегистры /БП/FIFO
LDP B4, [R0], #32 !; загрузить данные БП
LDP B5, [R0], #32 !; загрузить данные выходного FITO
LDP B6, [R0] , # 52 !; загрузить состояние аппаратного средства осуществления циклов
Команда STC используется для сохранения состояния Piccolo, когда Piccolo находится в режиме доступа к состоянию. Поле БАНК задает, какой банк сохраняется (см. табл.60).

Следующая последовательность будет сохранять полное состояние Piccolo по адресу в регистре R0.

STP В0, [R0], #16! сохранить личные регистры
STP B1, [R0], #64 ! сохранить регистры общего назначения
STP B2, [R0], #16 ! сохранить аккумуляторы
STP В3, [R0], #56 ! сохранить состояние Регистры/БП/FIFO
STP B4, [R0], #32 ! сохранить данные БП
STP B5, [R0], #32 ! сохранить данные выходного FIFO
STP B6, [R0], #52 ! сохранить состояние аппаратного средства осуществления циклов
Режим Отладки - в Piccolo должно быть заложено применение тех же механизмов отладки, которые поддерживаются ARM, т.е. всего программного обеспечения Demon и Angel и аппаратных средств с Embedded ICE (встроенный внутрисхемный эмулятор). Имеется несколько механизмов отладки системы Piccolo:
- прерывания команд ARM.

- прерывания данных (точки просмотра).

- прерывания команд Piccolo.

- программные прерывания Piccolo.

Прерывания команд ARM и данных обрабатываются модулем Embedded ICE ARM; прерывания команд Piccolo обрабатываются модулем Embedded ICE Piccolo; программные прерывания Piccolo обрабатываются ядром Piccolo.

Можно будет конфигурировать систему аппаратных прерываний таким образом, что будут прерываться как Piccolo, так и ARM.

Программные прерывания обрабатываются командой Piccolo (Halt или Break), заставляющей Piccolo останавливать исполнение, вводить режим отладки (в регистре состояния установлен бит В) и отключать себя (как если бы Piccolo был отключен командой PDISABLE). Счетчик команд остается достоверным, позволяя извлечь адрес точки прерывания. Piccolo далее не будет исполнять команды.

В режим пошагового исполнения для Piccolo будет переводиться установкой прерывания за прерыванием в командном потоке Piccolo.

Программная отладка - Основная функциональная возможность, предоставляемая Piccolo, это способность загружать и сохранять полное состояние в память при помощи сопроцессорных команд, когда он находится в режиме доступа к состоянию. Это позволяет отладчику сохранять полное состояние в память, считывать и/или обновлять его, и восстанавливать его в Piccolo. Механизм сохранения состояния Piccolo не будет деструктивным, то есть деятельность по сохранению состояния Piccolo не будет искажать ни одну из характеристик внутреннего состояния Piccolo. Это означает, что Piccolo может быть снова запущен после дампа его состояния без предварительного его восстановления.

Механизм обнаружения состояния кэша Piccolo должен еще быть определен.

Аппаратная отладка - Аппаратная отладка будет облегчаться цепью сканирования в сопроцессорном интерфейсе Piccolo. Piccolo может затем быть переведен в режим доступа к состоянию, после чего его состояние будет проверено/модифицировано при помощи цепи сканирования.

Регистр состояния Piccolo содержит отдельный бит для указания того, что он выполняет команду прерывания. Когда выполняется команда прерывания, Piccolo устанавливает бит В в Регистре состояния и останавливает выполнение. Чтобы иметь возможность опрашивать Piccolo, отладчик должен включить Piccolo и перевести его в режим доступа к состоянию путем записи в его регистр управления, перед тем как сможет произойти последующий доступ.

Фиг. 4 иллюстрирует устройство мультиплексора, реагирующего на бит H/L и бит Размер, для переключения соответствующих половин выбранного регистра, подаваемых на магистраль данных Piccolo. Если бит Размер указывает 16 бит, то схема дополнения знака заполняет биты старшего порядка магистрали данных соответственно нулями или единицами.


Формула изобретения

1. Устройство обработки данных, содержащее множество регистров для хранения элементов данных, которые должны быть обработаны, процессор для обработки команд, которые должны быть применены к элементам данных, хранящимся в упомянутом множестве регистров, блок переопределения регистров для преобразования ссылки на логический регистр в предварительно выбранном наборе команд в ссылку на физический регистр, идентифицирующую регистр, содержащий элемент данных, который требуется обработать упомянутым процессором, и аппаратное средство осуществления циклов для управления командой повторения, причем команда повторения определяет диапазон команд, которые должны быть повторены, упомянутый диапазон команд содержит упомянутый предварительно выбранный набор команд, при этом упомянутое аппаратное средство выполнено с возможностью периодического обновления данных блока переопределения регистров для изменения преобразования ссылки на логический регистр в ссылку на физический регистр, применяемого блоком переопределения регистров.

2. Устройство обработки данных по п. 1, отличающееся тем, что блок переопределения регистров выполнен с возможностью конфигурирования посредством команды переопределения, предназначенной для выполнения перед упомянутым предварительно выбранным набором команд.

3. Устройство обработки данных по п. 1, отличающееся тем, что аппаратное средство осуществления циклов выполнено с возможностью обновления данных блока переопределения регистров каждый раз, когда повторяется диапазон команд.

4. Устройство обработки данных по п. 1 или 3, отличающееся тем, что команда повторения включает один или более параметров переопределения, используемых для конфигурирования блока переопределения регистров.

5. Устройство обработки данных по п. 4, отличающееся тем, что предусмотрена команда переопределения, предназначенная для выполнения перед выполнением команды повторения для конфигурирования блока переопределения регистров с использованием одного или более параметров переопределения, причем упомянутая команда переопределения не включается в упомянутый диапазон команд, определенный командой повторения.

6. Устройство обработки данных по п. 4 или 5, отличающееся тем, что дополнительно включает средство хранения, предназначенное для хранения по меньшей мере одного набора предварительно определенных параметров переопределения, при этом каждый набор определяет конфигурацию переопределения для упомянутого блока переопределения, причем если упомянутые один или более параметров переопределения, включенные в упомянутую команду повторения, соответствуют одному из упомянутых наборов предварительно определенных параметров переопределения, то для блока переопределения регистров используется соответствующая конфигурация переопределения, без необходимости выполнения команды переопределения.

7. Устройство обработки данных по любому из пп. 4-6, отличающееся тем, что первый параметр переопределения идентифицирует некоторое количество регистров из упомянутого множества, которые должны быть подвергнуты переопределению блоком переопределения регистров.

8. Устройство обработки данных по любому из пп. 4-7, отличающееся тем, что блок переопределения регистров выполнен с возможностью осуществления переопределения на некотором количестве из упомянутого множества регистров, при этом логика переопределения регистров использует указатель базы в качестве значения смещения, которое должно быть добавлено к ссылке на логический регистр, при этом команда повторения включает второй параметр переопределения, идентифицирующий значение, на которое получает приращение указатель базы в предварительно определенных интервалах.

9. Устройство обработки данных по п. 8, отличающееся тем, что команда повторения включает третий параметр переопределения, обеспечивающий первое значение циклического возврата, и если в процессе приращения указателя базы он становится равным или превышает первое значение циклического возврата, приращение указателя базы циклически возвращается к новому значению смещения.

10. Устройство обработки данных по п. 8 или 9, отличающееся тем, что команда повторения включает четвертый параметр переопределения, обеспечивающий второе значение циклического возврата, и если ссылка на регистр, образованная сложением указателя базы и ссылки на логический регистр, становится равной или превышает второе значение циклического возврата, то эта ссылка на регистр циклически возвращается к новой ссылке на регистр.

11. Устройство обработки данных по любому из пп. 1-10, отличающееся тем, что упомянутое множество регистров содержит банки регистров, причем блок переопределения регистров выполнен с возможностью осуществления переопределения над некоторым количеством регистров в конкретном банке регистров.

12. Устройство обработки данных по п. 11, отличающееся тем, что блок переопределения регистров выполнен с возможностью осуществления независимого переопределения для каждого банка регистров.

13. Устройство обработки данных по любому из пп. 1-12, отличающееся тем, что команда включает множество операндов, и каждый операнд содержит ссылку на логический регистр, при этом блок переопределения регистров выполнен с возможностью осуществления независимого переопределения для каждого операнда.

14. Устройство обработки данных по любому из пп. 1-13, отличающееся тем, что представляет собой устройство цифровой обработки сигнала.

15. Способ работы устройства обработки данных, включающий этапы хранения в множестве регистров элементов данных, которые должны быть обработаны, извлечения из множества регистров одного или более элементов данных, требуемых для обработки команды, включая, если команда является одной из предварительно выбранного набора команд, использование блока переопределения регистров для преобразования ссылки на логический регистр в упомянутой команде в ссылку на физический регистр, идентифицирующую регистр, содержащий элемент данных, требуемый для обработки упомянутой команды, обработки команды с использованием упомянутых одного или более извлеченных элементов данных, и использования аппаратного средства осуществления циклов для управления командой повторения, определяющей диапазон команд, которые необходимо повторить, причем упомянутый диапазон команд содержит упомянутый предварительно выбранный набор команд, при этом упомянутое аппаратное средство осуществления циклов обеспечивает периодическое обновление данных блока переопределения регистров для изменения преобразования ссылки на логический регистр в ссылку на физический регистр, применяемого блоком переопределения регистров.

16. Способ по п. 15, отличающийся тем, что аппаратное средство осуществления циклов выполнено с возможностью обновления данных блока переопределения регистров каждый раз, когда повторяется диапазон команд.

17. Способ по п. 15 или 16, отличающийся тем, что команда повторения включает один или более параметров переопределения, которые должны быть использованы для конфигурирования блока переопределения регистров.

18. Способ по п. 17, отличающийся тем, что предусматривает выполнение команды переопределения, перед выполнением диапазона команд, которые должны быть повторены, чтобы конфигурировать блок переопределения регистров с использованием упомянутых одного или более параметров переопределения.

19. Способ по п. 17 или 18, отличающийся тем, что дополнительно включает этапы хранения по меньшей мере одного набора предварительно выбранных параметров переопределения, причем каждый набор определяет конфигурацию переопределения для блока переопределения регистров, и если упомянутые один или более параметров переопределения соответствуют одному из упомянутых наборов предварительно определенных параметров переопределения, то использования соответствующей конфигурации переопределения для блока переопределения регистров без необходимости выполнения команды переопределения.

20. Способ по любому из пп. 15-19, отличающийся тем, что упомянутое множество регистров содержит банки регистров, причем способ включает этап выполнения переопределения над определенным количеством регистров в конкретном банке.

21. Способ по п. 20, отличающийся тем, что дополнительно включает этап выполнения независимого переопределения для каждого банка регистров.

22. Способ по любому из пп. 15-21, отличающийся тем, что команда включает множество операндов, причем каждый операнд содержит ссылку на логический регистр, причем способ дополнительно включает этап выполнения независимого переопределения для каждого операнда.

РИСУНКИ

Рисунок 1, Рисунок 2, Рисунок 3, Рисунок 4, Рисунок 5, Рисунок 6, Рисунок 7, Рисунок 8, Рисунок 9, Рисунок 10, Рисунок 11, Рисунок 12, Рисунок 13, Рисунок 14, Рисунок 15, Рисунок 16, Рисунок 17, Рисунок 18, Рисунок 19, Рисунок 20, Рисунок 21, Рисунок 22, Рисунок 23, Рисунок 24, Рисунок 25, Рисунок 26, Рисунок 27, Рисунок 28, Рисунок 29, Рисунок 30, Рисунок 31, Рисунок 32, Рисунок 33, Рисунок 34, Рисунок 35, Рисунок 36, Рисунок 37, Рисунок 38, Рисунок 39, Рисунок 40, Рисунок 41, Рисунок 42, Рисунок 43, Рисунок 44, Рисунок 45, Рисунок 46, Рисунок 47, Рисунок 48, Рисунок 49, Рисунок 50, Рисунок 51, Рисунок 52, Рисунок 53, Рисунок 54, Рисунок 55, Рисунок 56, Рисунок 57, Рисунок 58, Рисунок 59, Рисунок 60, Рисунок 61, Рисунок 62, Рисунок 63, Рисунок 64, Рисунок 65, Рисунок 66, Рисунок 67



 

Похожие патенты:

Изобретение относится к вычислительной технике и может быть использовано для адресации матриц

Изобретение относится к системам обработки данных

Изобретение относится к области компьютерных систем и может быть использовано для выполнения процессором команд с плавающей запятой и упакованных данных

Изобретение относится к вычислительной технике и может быть использовано в устройствах для выборки команд при построении процессора ЭВМ

Изобретение относится к радиоэлектронике
Наверх