Если вы убедились, что сам синтаксический анализатор работает правильно, мы должны выяснить, что необходимо сделать для генерации правильного кода. С этого места дела становятся немного труднее так как правила более сложные.
Давайте с начала возьмем случай умножения. Эта операция аналогична "addops" в том, что оба операнда должны быть одного и того же размера. Она отличается в трех важных отношениях:
· Тип произведения обычно не такой же как тип двух операндов. Для произведения двух слов мы получаем в результате длинное слово.
· 68000 не поддерживает умножение 32 x 32, так что необходим вызов подпрограммы для программного умножения.
· Он также не поддерживает умножение 8 x 8, поэтому байтовые операнды должны быть переведены до слова.
Действия, которые мы должны выполнить, лучше всего показывает следующая таблица:
| T1
T2 | B | W | L | ||||
| B | Преобразовать D0 в W
Преобразовать D7 в W MULS Result = W | Преобразовать D0 в W
MULS Result = L | Преобразовать D0 в L
JSR MUL32 Result = L | ||||
| W | Преобразовать D7 в W
MULS Result = L | MULS
Result = L | Преобразовать D0 в L
JSR MUL32 Result = L | ||||
| L | Преобразовать D7 в L
JSR MUL32 Result = L | Преобразовать D7 в L
JSR MUL32 Result = L | JSR MUL32
Result = L |
Эта таблица показывает действия, предпринимаемые для каждой комбинации типов операндов. Есть три вещи, на которые необходимо обратить внимание: во-первых, мы предполагаем, что существует библиотечная подпрограмма MUL32, которая выполняет 32 x 32 умножение, оставляя 32-битное (не 64) произведение. Если в процессе этого происходит переполнение мы игнорируем его и возвращаем только младшие 32 бита.
Во-вторых, заметьте, что таблица симметрична. Наконец, обратите внимание, что произведение это всегда длинное слово, за исключением случая когда оба операнда байты. (Стоит заметить, между прочим, что это означает что результатом многих выражений будет длинное слово, нравится нам это или нет. Возможно идея перевода всех их заранее не была уж такой возмутительной, в конце концов!)