May 24th, 2021

QuatCore

"Пустопорожние" команды QuatCore

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

Список команд QuatCore, сторона DestAddr. Задачка на внимательность: найдите здесь NOP, No OPeration :)

DestAddr


Адрес +0 +1 +2 +3 +4 +5 +6 +7
00 OUT OUT OUT OUT OUT OUT OUT OUT
08 OUT OUT OUT OUT OUT OUT OUT OUT
10 SIO SIO SIO SIO SIO SIO SIO SIO
18 SIO SIO SIO SIO SIO SIO SIO SIO
20 ACQ ACQ ACQ ACQ ACQ ACQ ACQ ACQ
28 ACQ ACQ ACQ ACQ ACQ ACQ ACQ ACQ
30 TRK TRK TRK TRK TRK TRK TRK TRK
38 TRK TRK TRK TRK TRK TRK TRK TRK
40 ERL ERL ERL ERL ERL ERL ERL ERL
48 ERH ERH ERH ERH ERH ERH ERH ERH
50 [ER++] [ER++] [ER++] [ER++] [ER++] [ER++] [ER++] [ER++]
58 [ER++] [ER++] [ER++] [ER++] [ER++] [ER++] [ER++] [ER++]
60 IR IR IR IR IR IR IR IR
68 IR IR IR IR IR IR IR IR
70 IR IR IR IR IR IR IR IR
78 IR IR IR IR IR IR IR IR
80 Acc PM ADD SUB ABS ABSPM ABSA ABSS
88 ZACC NOP C C DIV2 DIV2PM DIV2A DIV2S
90 MUL FMPM FMA FMS MULSU SUFMPM SUFMA SUFMS
98 MULU UFMPM UFMA UFMS SQRD2 SQRPMD2 SQRAD2 SQRSD2
A0 i j k Inv i++ j++ k++ ijk
A8 iLOOP jLOOP kLOOP Jik iLoopUp jLoopUp kLoopUp JNik
B0 JMP JMP JMP JMP JMP JMP JMP JMP
B8 JL JL JO JO JGE JGE JNO JNO
C0 [X+1] [X+2i+1] [X+2j+1] [X+3j+1] [X+i] [X+3i] [X+2j+i] [X+3j+i]
C8 [X+k] [X+2i+k] [X+2j+k] [X+3j+k] [X+i^j] X [X+2j+i^j] [X+3j+i^j]
D0 [Y+1] [Y+2i+1] [Y+2j+1] [Y+Treug[j]+1] [Y+i] [Y+3i] [Y+2j+i] [Y+Treug[j]+i]
D8 [Y+k] [Y+2i+k] [Y+2j+k] [Y+Treug[j]+k] [Y+i^j] Y [Y+2j+i^j] [Y+Treug[j]+i^j]
E0 [Z+1] [Z+2i+1] [Z+2j+1] [Z+3j+1] [Z+i] [Z+3i] [Z+2j+i] [Z+3j+i]
E8 [Z+k] [Z+2i+k] [Z+2j+k] [Z+3j+k] [Z+i^j] Z [Z+2j+i^j] [Z+3j+i^j]
F0 [SP+1] [SP+2i+1] [SP+2j+1] [SP++] [SP+i] [SP+3i] [SP+2j+i] [i-1+SP++]
F8 [SP+k] [SP+2i+k] [SP+2j+k] [--SP+k] [SP] SP [SP+2j] [--SP]


Когда кроме вычислительного ядра ничего нет (никакой периферии), всё просто: ВСЕ АДРЕСА от 0x00 до 0x7F означают NOP, в этом была определённая симметрия: на стороне SrcAddr это адреса для "непосредственных значений" (Immediate), когда нужно не в память лезть, не в регистры, а просто выдать на шину конкретное число. А тогда если надо из шины число записать не в память и не в регистр - то выходит как раз "пустота", /dev/null и так далее.

cat /dev/zero > /dev/null - переливание из пустого в порожнее. У нас когда-то команда "0 0" так и делала. Точнее, она брала ровно один нолик и отправляла его в никуда. Наглухо она не зависала.

Но потом начал обвешиваться устройствами, и такой "лакомый кусок" из 128 адресов быстренько занял. Очень жадно: каждая команда ввода-вывода отжирает целые области памяти (ради упрощённого декодирования), но почему бы и нет.

А NOP случайно получился в АЛУ, просто "сам собой". Отдельные биты адреса означали те или иные аспекты команды (длинная операция, вроде умножения, или короткая, знаковая или беззнаковая, с накоплением или без накопления), логика формировалась, чтобы получить всё это разнообразие, не прибегая к микрокоду (и вполне успешно), и вот просто повезло, что и NOP там образовался. Но адрес у него "хитрючий" :)

Хотя QuatCore не исключение, вот в процессоре 6502 код операции для NOP: 0xEA, что очень веселит "фанатов" компании Electronic Arts, ну реально она ничего не делает!

И не знаю почему, вдруг подумалось: а если бы не сложился в АЛУ этот NOP, и от ввода-вывода специально под это адрес не "откусывать", можно было бы без него обойтись?

Collapse )