Task #7743
closedКоммит 905af510: Sub instruction added
0%
Description
Добавил описание инструкций subf и subf., однако не под своим именем, т.к. гит был настроен на старый проект. Также заметил что из комментариев пропали все специальные символы такие как ← и.т.д., хотя в файле перед отправкой они были. Прошу проверить правильность описания инструкции и сообщить если есть какие-то проблемы. У меня тесты выполняются без ошибок.
Updated by Andrei Tatarnikov almost 8 years ago
Несколько общих замечаний:
- В спецификациях не должно быть символов табуляции. У нас принято вместо них использовать пробелы.
- Внутренние инструкции, к которым не обращаются на прямую, такие как
op add_general
, нужно помечать ключевым словомinternal
(т.е.internal op add_general
). - Не нужно злоупотреблять использованием атрибута
init
. Опкоды нужно помещать в строку форматирования. Атрибутinit
должен использоваться только тогда, когда по-другому не получается. Промежуточные присваивания, которые делаются внутри этого атрибута, создают проблемы при дизассемблировании. Также это вредит производительности (init
выполняется перед каждым вызовом других атрибутов). Таким образом, все кострукции типа:
должны быть переписаны как:op addi (rt: R, ra: R, simm: SHORT) init = { OPCD = coerce(card(6), 0b011100); } syntax = format("addi %s, %s, %d", rt.syntax, ra.syntax, simm) image = format("%16s%5s%5s%6s", simm, ra.image, rt.image, OPCD)
op addi (rt: R, ra: R, simm: SHORT) syntax = format("addi %s, %s, %d", rt.syntax, ra.syntax, simm) image = format("%16s%5s%5s011100", simm, ra.image, rt.image)
Updated by Alexander Protsenko almost 8 years ago
- Assignee set to Alexander Protsenko
1. Есть негласное соглашение в спецификациях MicroTESK вместо символа табуляции ставить 4 пробела. (В большинстве редакторов можно настроить автозамену.) Стоит этого придерживаться.
2. На счет
internal op add_generalэто ключевое слово появилось у нас недавно, пример для PowerPC писался раньше, так что не отражал этого. Я сейчас поправлю это.
3. Наличие символов подобных "←" не желательно. Это мое упущение, опять же сейчас я сам это поправлю.
4. По поводу "init", в примерах все верно. Пришли с Андреем по этому поводу к соглашению. Его вариант тоже верен, но пока лучше использовать вариант из примера.
Updated by Alexander Protsenko almost 8 years ago
- Status changed from New to Feedback
- Assignee changed from Alexander Protsenko to Pavel Putro
Обновил "powerpc_alu.nml". Поправил все о чем писал выше.
Важно: необходимо обновить версию ядра MicroTESK до последнего. (https://forge.ispras.ru/attachments/download/4928/microtesk-2.4.3-beta-161118.tar.gz)
Немного общих пояснений:
1. Описание инструкций берется из документа EREF_RM.pdf (EREF: A Programmer’s Reference Manual for Freescale Power Architecture Processors). Стоит отметить, что в e500mc 32 битные регистры, а описание в документе универсальное.
2. Регистры и поля регистров, такие как:
XER_SO = XER_SO | XER_OV .... CR0_SO = XER_SO;объявлены в файле "powerpc.nml" (86+ строка на данный момент)
Ошибок в инструкциях найдено не было.
Updated by Alexander Protsenko almost 8 years ago
Обновлена группа инструкций add (add., addo, addo.). Были вынесены общие "syntax" и "image" в add_general().
(Предлагается использовать этот пример для спецификации новых групп инструкций, если он применим.)
Исправлена в шаблоне операция "OR".
Updated by Pavel Putro almost 8 years ago
Нужно ли, для соблюдения стиля, обновить таким способом все уже созданные инструкции?
Updated by Alexander Protsenko almost 8 years ago
Pavel Putro wrote:
Нужно ли, для соблюдения стиля, обновить таким способом все уже созданные инструкции?
Если говорить про стиль, то первая версия ему соответствует. И необходимости в этом нет.
Лучше сосредоточиться на добавление новых инструкций. Последний пример показывает, как ускорить процесс спецификации групп инструкций.
Updated by Andrei Tatarnikov almost 8 years ago
В спецификации было добавлено ключевое слово pseudo
(коммит 974ac00e8a84cebdfdec61d780f3fb4e0aaf4e2e).
Оно должно использоваться для инструкций, которые являются производными от других инструкций (например, являющихся их частным случаем, как mr
и or
). Это все интструкции, помеченные как "Equivalent to: ..."
. У таких инструкций опткоды совпадают опткодами базовых инструкций, и при декодировании невозможно выбрать правильный вариант. Поэтому при помощи ключевого слова pseudo
все производные интсрукции должны исключаться из рассмотрения, а при декодировании всегда будут получаться базовые инструкции.
Например, инструкция mr rA,rS
всегда будет декодироваться как or rA,rS,rS
.
// mr: Move register
// mr rA,rS (Rc=0) Equivalent to: or rA,rS,rS
pseudo op mr (ra: R, rs: R)
init = {
Rc = coerce(BIT, 0);
XO_10 = coerce(card(10), 0b0011110110);
OPCD = coerce(card(6), 0b111110);
}
syntax = format("mr %s, %s", ra.syntax, rs.syntax)
image = format("%1s%10s%5s%5s%5s%6s", Rc, XO_10, rs.image, ra.image, rs.image, OPCD)
action = {
or(ra, rs, rs).action;
}
Updated by Sergey Smolov almost 5 years ago
- Detected in build changed from svn to master
Задача ещё актуальна?
Updated by Pavel Putro almost 5 years ago
- Status changed from Feedback to Closed