Pull to refresh

Comments 10

Хотя теоретически 68k хуже соответствуют мультискалярной архитектуре, чем x86

откуда такой вывод?

68k флаги почти всегда ставит, перенос даже на загрузках сбрасывает. Это создаёт много искусственных зависимостей между инструкциями. Кроме того, там ещё с 68020 адресация пошла переусложненная, типа под VAX.

68k флаги почти всегда ставит, перенос даже на загрузках сбрасывает

Тормозит частичная установка флагов и частичная запись в регистр. Но нет ничего невозможного. В этом отношении 68к явно не хуже чем х86.

Вот сложная косвенная адресация это негативный фактор. В Coldfire отрезали то, что мешало.

Современные софт-ядра 68k намного быстрее 68060 и старых PPC.

http://www.apollo-core.com/index.htm?page=performance

Умножения на PowerPC похоже на умножение в ARM, одно умножение дает только половину результата.

Давным-давно доступны инструкции с полным результатом umull/smull/umall/smlal.

https://developer.arm.com/documentation/dui0489/i/arm-and-thumb-instructions/smull

Можно использовать регистры и 16-битные константы, что выгодно отличает от архитектуры ARM, где константы только 8-битные

Так-то есть movt/movk.

https://developer.arm.com/documentation/ddi0596/2020-12/Base-Instructions/MOVK--Move-wide-with-keep-

Флаги создают проблему, их генерацию не случайно отключают когда возможно и в ARM, и в PowerPC, и в MIPS, ...
Вот пример,
ADD RBX,RCX
MOV RDX,RSI

Эти х86 команды могут нормально исполняться параллельно, а на 68к подобные команды просто так этого не смогут, так как обе они там ставят флаги и нужно фиксировать флаги именно от MOVE.
И у меня обзор процессоров до середины 90-х, тогда и ARM и PowerPC были попроще. У современных ARM и PowerPC инструкций побольше, чем у CISC-процессора 80-х.

Флаги создают проблему, их генерацию не случайно отключают когда возможно и в ARM

Их отключают для удобства программирования.

ARM поддерживает условное выполнение, поэтому нужно чтобы последовательности инструкций не трогали флаги.

В thumb режиме, где условного выполнения нет, инструкции спокойно пишут флаги.

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

cmp r0,#0
addeq r1,r2,r3
eoreq r1,r1,r4
subne r1,r2,r3
andne r1,r1,r5
----
if (r0 == 0)
   r1 = (r2 + r3) ^ r4
else
  r1 = (r2 - r3) & r5

К тому же частичный апдейт флагов мешает OoO, о чём я писал.

Вот пример,ADD RBX,RCX MOV RDX,RSIЭти х86 команды могут нормально исполняться параллельно, а на 68к подобные команды просто так этого не смогут,

Чушь.

Тут нет зависимостей по данным (в отличие от команды ADD). И нет зависимостей по флагам - флаги не читаются. WAW конфликт по флагам даже в in-order процессоре в данном случае решается однозначно.

Если следовать вашей логике, то на суперскалярном in-order x86 процессоре, типа p54, нельзя выполнитьADD RBX,RCX; ADD RDX,RSI за такт, ведь обе инструкции ставят флаги =)

 адресные регистры прямо как из 8-х систем взяты и куча там ещё разных мелких несуразностей и пустых претензий.

Да и так понятно, что претензии пустые, после выдуманного вами "несовершенства" инструкции move :)

Кстати movea не имеет это СТРАШНОГО недостатка!

А то что не нужна лишняя команда cmp при проверке значений на ноль вас не радует?

Что касательно адресных регистров, то это

1) Элегантное решение для уменьшения бит отведённых на номер регистра в коде команды.

Кодируем 16 регистров в 3 битах.

Таблица кодов команд 68k - это же произведение искусства!

http://goldencrystal.free.fr/M68kOpcodes-v2.3.pdf

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

2) Адресные регистры это как раз вполне себе будущее в эволюции архитектур

Адрес должен иметь размер буфера и теги для доступа к памяти, как сделано в защищённом режиме Эльбруса (128-битные указатели) или CHERI / Morello (там правда отдельные дескрипторы).

Да и так понятно, что претензии пустые, после выдуманного вами "несовершенства" инструкции move :)

Добавьте к моему примеру например JZ - предполагалось, что это понятно и без подсказки. И аналогично без шаманства ваш пример для пентиума просто так параллельно не пройдет, надо будет как-то синхронизовать по флагам.

Адресные регистры это как раз вполне себе будущее в эволюции архитектур

адресные (они же индексные) регистры, простое прямое наследие парадигм ультрапростых z80, 6502, 6809, ... И при кодировании морока с ними, вроде и регистры, а вроде не совсем, и аналогично с регистрами данных. Вы бы ещё регистры-аккумуляторы захотели.

Успехов Вам в проектировании архитектур, которые взяты из посредственных примеров из прошлого. Для упорных голов нет непробиваемых стен. :) Но считать себя круче, тысяч лучших инженеров, работавших с процессорами IBM, Motorola, Sun, ... и, в частности, с POWER, ARM, 88000, MIPS, SPARC, ... - это скорее заявка на что-то другое.

Во-1, изменение целиком всех флагов зависимостей создает не более, чем например запись результата в один и тот же регистр без его чтения. Прекрасно разруливается переименованием регистров в OoO-ядре и никаких зависимостей по данным не создает. Частичная модификация флагов -- может создать (а может и не создать -- если флаговый регистр порезать на независимые части). И это как раз есть в х86 -- те же инкременты.

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

Потому если честно такое головотяпство в адрес одной из самых элегантныx 32-битных cisc-архитектур выглядит с вашей стороны не очень красиво.

Привел вам пример, как вы там сделаете параллельное исполнение на 68к? Не говорю, что это невозможно, но это потребует дополнительных схем, удорожания и перегрева. У меня была Амига, но ассемблер мне не особо понравился, адресные регистры прямо как из 8-х систем взяты и куча там ещё разных мелких несуразностей и пустых претензий. Хотя кодов на 68к немало написал. Но это только моё личное мнение. Красота в глазах смотрящего. Есть ещё vax-энтузиасты! По адресации мне представляется проблема в том, что косвенная адресация нужна редко, поэтому она и вымерла, а на х86 её никогда и не было.

Я уже написал ответ. Флаги от 1ой операции пойдут в физический регистр флагов номер N, от второй - в N+1. Также будет помечено, что результат после этих двух операций лежит в N+1. Зависимостей по данным нет. Типичное поведение любого OoO-ядра.

Ну и да, теперь понятна ваша нелюбовь к 68к.

... 601 появился в 1993 ...
Всего на год позже был выпущен Alpha, но сразу 64 битный с 128-ми битной шиной данных.

Sign up to leave a comment.

Articles