Task #5350
closedLabels in the text of instruction calls
100%
Description
Не обходим вменяемый механизм использования меток в сгенерированом коде инструкций. Сейчас используется ненадёжно решение, основанное на замене текста (r2689).
Суть проблемы состоит в следующем. Вот типичный код операции ветвления:
op BEQ (rs : R, rt : R, offset : SHORT) syntax = format("BEQ %s, %s, %<label>d", rs.syntax, rt.syntax, offset) image = format("000100%s%s%s", rs.image, rt.image, offset) action = { if rs == rt then // Informs that control transfer is to be performed BRANCH = 1; // Calculates the jump address and saves it to a temporary variable JMPADDR = NIA + (offset << 3); endif; }
Адрес для перехода получается на основе параметра offset (смещение), который представляет собой некоторую числовую константу. В тестовом шаблоне этот параметр может задаваться как обращение к некой метке и при этом инструкции будет передана некая произвольная (fake) константа, т.к. у нас сейчас нет модели памяти и мы не можем вычислить смещение. Проблема: при герации кода у нас получается некорректный код: вызов инструкции B будет с произвольным смещением. Поэтому, необходимо в таких случах вместо fake аргумента подставлять имя метки. При этом важно поддерживать оба варианта использования: (1) передавать инструкции константные значения и (2) использовать метки.
Нужно продумать решение. Скорее всего поддержка должна быть на уровне модели. Т.е. модель должна уметь регистрировать метки и подставлять соответствующие имена, если метка для данного значения зарегистрирована.
В Sim-nML добавлено следующее соглашение. В строке форматирования используется тег <label> для обозначения значений, которые могут быть заменены на имя соответствующей метки.
syntax = format("BEQ %s, %s, %<label>d", rs.syntax, rt.syntax, offset)