БЭСМ6 код-гольф поменять местами два верхних элемента на стеке

93 views
Skip to first unread message

Alex Loktionoff

unread,
Feb 15, 2023, 3:49:17 PM2/15/23
to БЭСМ-6
Кто знает как быстрее всего на автокоде swap Cумматор <-> П(М15-1) A<->B

   15 AEX -1     #A^B                                  +1
   15 ATX         #*(SP++)=A^B                  +1
    YTA              #A
    15 ATX -2    #*(SP-2)=A                       +1
    15 AEX        #A^*(--SP)      //A^(A^B)  +1

4 обращения к кешу и сколько тактов мне трудно сказать...
Кто меньше?

Leo B.

unread,
Feb 15, 2023, 5:12:45 PM2/15/23
to БЭСМ-6
Это круто. У вас получается в УУ 5*3 = 15 тактов, и в АУ, если верить средним значениям для команды AEX (причины, по которым AEX могла выполняться то 2, то 3 такта, мне не совсем понятны), 2*2.5+2*3+3 = 14 тактов,  всё конвейеризовано.

Меньше будет вряд ли. С тем же количеством команд, на 3 такта медленнее, но более логически прозрачно (не считая некоторой неочевидности команды 15 STX):

15 STX
      AEX
 15 XTA 1
 15 ATX
      YTA

Скорее всего, так люди и писали, когда им надо было. Последовательность команд "YTA; 15 ATX -2" (в дампе диска "счмр       зп -2(17)") на образах дисков не находится; по крайней мере в одном слове. 

А то можно и https://www.gnu.org/software/superopt/ под БЭСМ-6 заточить и запустить, пусть ищет.

Leo

Michael Yaroslavtsev

unread,
Feb 15, 2023, 5:18:21 PM2/15/23
to be...@googlegroups.com
On Wed, Feb 15, 2023 at 12:49 PM Alex Loktionoff <oxy...@gmail.com> wrote:
Кто знает как быстрее всего на автокоде swap Cумматор <-> П(М15-1) A<->B

   15 AEX -1     #A^B                                  +1
   15 ATX         #*(SP++)=A^B                  +1
    YTA              #A
    15 ATX -2    #*(SP-2)=A                       +1
    15 AEX        #A^*(--SP)      //A^(A^B)  +1

4 обращения к кешу
Кеш, в его современном понимании, на мой взгляд, не очень подходящий термин.
БРЗ - это, всё же, регистры процессора.
и сколько тактов мне трудно сказать...
Кто меньше?

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/f1a2667e-c849-45bc-969a-eb268dce1bcbn%40googlegroups.com.


--
Thanks,
-- Michael

Leo B.

unread,
Feb 15, 2023, 7:02:51 PM2/15/23
to БЭСМ-6
4 команды, но те же 18 тактов УУ.
 
15 STX
15 ATX 2
15 XTA 1
15 XTS 2

Alex Loktionoff

unread,
Feb 16, 2023, 2:42:33 PM2/16/23
to БЭСМ-6
Есть ли какая утилита, чтоб более-менее достоверно посчитать такты фрагмента кода? Чтоб не просто складывала средне-статистические времена исполнения, а а складывала и учитывала занятость отдельных устройств УУ АУ БРЗ Памяти?  

среда, 15 февраля 2023 г. в 23:12:45 UTC+1, Leo B.:

Leo B.

unread,
Feb 16, 2023, 5:19:53 PM2/16/23
to БЭСМ-6
On Thursday, February 16, 2023 at 11:42:33 AM UTC-8 oxy...@gmail.com wrote:
Есть ли какая утилита, чтоб более-менее достоверно посчитать такты фрагмента кода? Чтоб не просто складывала средне-статистические времена исполнения, а а складывала и учитывала занятость отдельных устройств УУ АУ БРЗ Памяти?  

Это уже начинает приближаться к cycle-accurate simulation, и для подсчетов на таком уровне у нас ничего нет.  Сколько-то лет назад я приписал в эмуляторе Диспака среднестатистические времена исполнения каждой команды в УУ и АУ, признак необходимости дожидаться опустошения буфера арифметических команд (БАК), и симуляцию собственно БАК на 4 команды, ради выяснения, давала ли, БЭСМ-6 миллион операций в секунду, например, на Whetstone, и какой был коэффициент совмещения (т.е. какой процент тактов и УУ, и АУ что-то делали одновременно). Задержки на обращение к памяти и ассоциированные с ней регистры (БРЗ, БРС, БРЧ) не симулировались. В результате получилось, согласно Whetstone, если правильно помню, около 0.95Mops, и около 500KFlops. Коэффициент совмещения был, опять же, по памяти, около 60%. 

Этот вариант эмулятора Диспака я никуда не выкладывал, и не уверен, что смогу найти у себя. Впрочем, собственно функционального кода там минимум; больше всего времени в этом процессе заняло вбивание чисел в инициализацию структуры. 

Другой аспект - это симуляция истинного времени выполнения каждой арифметической команды. Согласно таблице, время выполнения команды сложения в АУ - от 5 до 280 (!!!) тактов, в среднем 11 (???). 
Могут занимать большое время: выравнивание порядков перед сложением, приведение переноса  в процессе сложения, нормализация влево после сложения, поскольку сквозных цепей не было, а всё делалось на сдвиговых регистрах и индивидуальных full adders. Я написал небольшую программу, симулирующую этот процесс, и на случайных тестах получил, что сложение целых чисел (для которых выравнивание порядков не требуется, а нормализация заблокирована) в медианном среднем занимает 9 тактов (с учетом совмещения - вот оно и основание утверждать про 1 MIPS), а сложение плавающих чисел, отличающихся по порядку не более чем на 20 - 13 тактов.

Складывать числа, различающиеся по порядку больше, чем на половину ширины мантиссы, непрофессионально - точность существенно теряется, так что можно считать, что в реальных программах  так и не делали. 
Исключение - сложение с вещественным нулём, у которого был минимальный возможный порядок, и сложение с ним было жутко медленным, но будем думать, что это был нечастый случай.

Табличное значение 11,  тогда, выходит средним арифметическим из 9 и 13. 

Собственно средние арифметические для целых и плавающих были 9.66 и 13.96. 

Где-то, впрочем, моя программа чего-то не учитывает. Сложение машинного нуля и специально сконструированного "нуля" с максимальным порядком согласно программе требует 259 тактов, а откуда берутся 280, упомянутые в ТО, так и осталось неясным. Разумно предположить, что их на самом деле должно было быть 260, т. е.  у меня где-то ошибка на 1 такт, а 8 вместо 6 в тех. описании - проблема чьего-то почерка.

Leo

Alex Loktionoff

unread,
Feb 28, 2025, 12:27:11 PMFeb 28
to БЭСМ-6
Кто знает был ли способ записи/чтения индексных регистров в/из память/стек минуя порчу аккумулятора?
В БЕСМ6 или ЭЛБРУС-1КБ

Интересует особенно с точки зрения кодогенерации, т.е. алелокации регистров. Если такой возможности нет, то spill/fill вообще нет смысл реализовать?  

среда, 15 февраля 2023 г. в 21:49:17 UTC+1, Alex Loktionoff:

Leo Broukhis

unread,
Feb 28, 2025, 1:33:24 PMFeb 28
to be...@googlegroups.com
Писать в память, минуя сумматор, было в принципе невозможно, а установить регистр по содержимому памяти, не трогая сумматор, тривиально:

МОД ячейка
УИА (регистр)

или, если угодно,

,WTC,location
reg,VTM,

Leo

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/33661cc3-a675-47f7-b0a1-e04b44f91ee8n%40googlegroups.com.

Leo B.

unread,
Feb 28, 2025, 3:35:34 PMFeb 28
to БЭСМ-6
Что касается spill, то запись регистра в память, не изменяя сумматор, делается тоже двумя командами,

,ITS,reg
,STX,location

Положить что-то в стек, не изменяя сумматор, без использования дополнительной статической рабочей ячейки, можно тремя командами

15,ATX,1 (спрятали сумматор выше первой свободной ячейки стека)
,XTA,loc ( или ,ITA,reg) считали желаемое на сумматор
15,XTS, (записали в стек, продвинули указатель, считали старое содержимое сумматора по инкрементированному указателю)

С использованием статической ячейки аналогично:
,ATX,temp
,XTA,loc / ,ITA,reg
,XTS,temp

Leo

Alex Loktionoff

unread,
Mar 1, 2025, 5:37:49 AMMar 1
to БЭСМ-6
Для spill/fill важно быстродействие, иначе теряется весь смысл.
Если fill ,WTC, literal   Mx, VTM, хоть и затыкал конвейер, но не блокировал операцию с аккумулятором /* деление умножение и даже суммирование идет много тактов*/
Да и в новой реализации процессора затыкания можно избежать.

То  spill через аккумулятор полностью портит все дело, на запись в память индексного регистра приходится одна запись  аккумулятора в стек и одно чтение. Это 200% накладных расходов.
Хотя если бы  ITA сохраняла A в Y, а потом можно было восстановить A из Y, то компилятор мог бы частенько найти окошко в коде, когда Y не используется...

пятница, 28 февраля 2025 г. в 21:35:34 UTC+1, Leo B.:
Что касается spill, то запись регистра в память, не изменяя сумматор, делается тоже двумя командами,

,ITS,reg
,STX,location

...
Leo
On Friday, February 28, 2025 at 10:33:24 AM UTC-8 Леонид Брухис wrote:
Писать в память, минуя сумматор, было в принципе невозможно, а установить регистр по содержимому памяти, не трогая сумматор, тривиально:

МОД ячейка
УИА (регистр)

или, если угодно,

,WTC,location
reg,VTM,

Leo
....

Leo B.

unread,
Mar 1, 2025, 1:29:31 PMMar 1
to БЭСМ-6
WTC использует входной регистр АУ, который нужен для выполнения арифметических команд. Так что единственная разница между WTC+VTM и XTA+ATI в том, что первая не портит сумматор. В остальном всё то же самое. 
В стековой машине с быстрыми регистрами записи с механизмом LRU функцию spill-fill для арифметических операций  берут на себя БРЗ, а чтобы для индекс-регистров имело делать spill-fill в процессе вычисления арифметических выражений, т. е. когда обсуждаемый вопрос имеет смысл, в теле цикла должно использоваться как минимум 10 разных массивов (с 9 Форекс справляется). Видимо, когда разрабатывали машину (и оптимизировали подобные циклы вручную), решили, что для большинства практических применений имеющихся индекс-регистров будет достаточно.

Leo

Alex Loktionoff

unread,
Mar 26, 2025, 3:39:15 PMMar 26
to БЭСМ-6
Кто знает быстрый способ деления/умножения на 2 чисел в аккумуляторе чисел с нормализацией и без? /*т.е. фактически целых и дробных*/

Leo B.

unread,
Mar 26, 2025, 3:53:12 PMMar 26
to БЭСМ-6
On Wednesday, March 26, 2025 at 12:39:15 PM UTC-7 oxy...@gmail.com wrote:
Кто знает быстрый способ деления/умножения на 2 чисел в аккумуляторе чисел с нормализацией и без? /*т.е. фактически целых и дробных*/

 
При включенной нормализации самый быстрый способ умножить число с плавающей точкой на 2 - это инкрементировать его порядок (,E+N,64+1 )
При выключенной нормализации, если целое число без порядка, то, очевидно, просто сдвинуть влево на разряд (,ASN,64-1)
При выключенной нормализации, если целое число представленно как денормализованное с порядком (64000...000nnnn), 
то сложить его с собой (15,ATX,  и 15,A+X,) 

Как бы безвариантно. Не командой умножения же пользоваться.

Leo

Alex Loktionoff

unread,
Mar 26, 2025, 4:28:34 PMMar 26
to be...@googlegroups.com


26 марта 2025 г., в 8:53 PM, Leo B. <leo...@gmail.com> написал(а):

On Wednesday, March 26, 2025 at 12:39:15 PM UTC-7 oxy...@gmail.com wrote:
Кто знает быстрый способ деления/умножения на 2 чисел в аккумуляторе чисел с нормализацией и без? /*т.е. фактически целых и дробных*/

 
При включенной нормализации самый быстрый способ умножить число с плавающей точкой на 2 - это инкрементировать его порядок (,E+N,64+1 )
Получается без дополнительного обращения к памяти, да еще на заданное число в регисте раз? Круто.
Только две разные команда для сдвига влево/право  /*умножения/деления*/?

При выключенной нормализации, если целое число без порядка, то, очевидно, просто сдвинуть влево на разряд (,ASN,64-1)
А эта команда позволяла и делить и умножать в зависимости от эффективного адреса B=Mi + A ? Или надо было ловить старшие разряды в Y?

При выключенной нормализации, если целое число представленно как денормализованное с порядком (64000...000nnnn), 
то сложить его с собой (15,ATX,  и 15,A+X,) 
Вот больше всего меня беспокоил этот вариант - два обращения к кешу.
И по сути не принципиально быстрее чем , A*X , = 2 если в цикле и 2-ка будет закеширована.
Или можно:
, ASN, 64-1
, E+N, B’014

А деление? Тут получается , A*X , = .5 ?

Или:
, ASN, 64-65
, E+N, B’032

:)

Как бы безвариантно. Не командой умножения же пользоваться.

Leo

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "БЭСМ-6".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/besm6/l1nwBCh0TLY/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/95cf31fc-5a9c-4c27-bed6-45841b41aac0n%40googlegroups.com.

Leo B.

unread,
Mar 26, 2025, 5:09:07 PMMar 26
to БЭСМ-6
On Wednesday, March 26, 2025 at 1:28:34 PM UTC-7 oxy...@gmail.com wrote:
 
При включенной нормализации самый быстрый способ умножить число с плавающей точкой на 2 - это инкрементировать его порядок (,E+N,64+1 )
Получается без дополнительного обращения к памяти, да еще на заданное число в регисте раз? Круто.
Только две разные команда для сдвига влево/право  /*умножения/деления*/?

Поделить на 2, соответственно, ,E+N,64-1 (или, если угодно, ,E-N,64+1)
 
При выключенной нормализации, если целое число без порядка, то, очевидно, просто сдвинуть влево на разряд (,ASN,64-1)
А эта команда позволяла и делить и умножать в зависимости от эффективного адреса B=Mi + A ? Или надо было ловить старшие разряды в Y?

Не понял вопроса. Строго говоря, если число могло быть отрицательным, то после сдвига влево нужно погасить порядок с помощью  ,AAX,=37777777777777B

При выключенной нормализации, если целое число представленно как денормализованное с порядком (64000...000nnnn), 
то сложить его с собой (15,ATX,  и 15,A+X,) 
Вот больше всего меня беспокоил этот вариант - два обращения к кешу.
И по сути не принципиально быстрее чем , A*X , = 2 если в цикле и 2-ка будет закеширована.
Или можно:
, ASN, 64-1
, E+N, B’014 - ?????

Порядок у целого числа был 1101000  (104), после сдвига стал 1010000 (80), т. е. корректировать надо на 24, соответственно, ,Е+N,64+24 Но тогда всё равно придется гасить  младший разряд порядка, если число могло быть отрицательным и от сдвига знак мантиссы въехал в порядок, и выгода пропадает.

А деление? Тут получается , A*X , = .5 ?

Нормализованные см. выше.
Целые, если неотрицательное и без порядка, то  ,ASN, 64+1 достаточно.
Если неотрицательное с порядком, то был порядок 104, стал 52,  следовательно, надо ,E+N,64+52;
А если может  быть отрицательным, то всё сложнее (см. как это делают FOREX или Фортран-ГДР для чисел с порядком).


Или:
, ASN, 64-65   -  ???????
, E+N, B’032

:)


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

Leo 

Василий Долматов

unread,
Mar 27, 2025, 2:16:18 AMMar 27
to be...@googlegroups.com


26 марта 2025 г., в 23:28, Alex Loktionoff <oxy...@gmail.com> написал(а):



26 марта 2025 г., в 8:53 PM, Leo B. <leo...@gmail.com> написал(а):

On Wednesday, March 26, 2025 at 12:39:15 PM UTC-7 oxy...@gmail.com wrote:
Кто знает быстрый способ деления/умножения на 2 чисел в аккумуляторе чисел с нормализацией и без? /*т.е. фактически целых и дробных*/

 
При включенной нормализации самый быстрый способ умножить число с плавающей точкой на 2 - это инкрементировать его порядок (,E+N,64+1 )
Получается без дополнительного обращения к памяти, да еще на заданное число в регисте раз? Круто.
Только две разные команда для сдвига влево/право  /*умножения/деления*/?

При выключенной нормализации, если целое число без порядка, то, очевидно, просто сдвинуть влево на разряд (,ASN,64-1)
А эта команда позволяла и делить и умножать в зависимости от эффективного адреса B=Mi + A ? Или надо было ловить старшие разряды в Y?

При выключенной нормализации, если целое число представленно как денормализованное с порядком (64000...000nnnn), 
то сложить его с собой (15,ATX,  и 15,A+X,) 
Вот больше всего меня беспокоил этот вариант - два обращения к кешу.
И по сути не принципиально быстрее чем , A*X , = 2 если в цикле и 2-ка будет закеширована.
Или можно:
, ASN, 64-1
, E+N, B’014

А деление? Тут получается , A*X , = .5 ?
плавающее "деление пополам» - только так…

опять-таки, в свое время за написание (на любом языке из языков Б-6) В:= А/2
у нас отрывали руки… :) 

dol@

Leo B.

unread,
Mar 27, 2025, 2:33:59 AMMar 27
to БЭСМ-6
On Wednesday, March 26, 2025 at 11:16:18 PM UTC-7 ReedCat wrote:

А деление? Тут получается , A*X , = .5 ?
плавающее "деление пополам» - только так…

[expletive redacted]  Идём на онлайн-эмулятор, https://mailcom.com/besm6/runitnew.cgi которому скоро 30 лет исполнится, так что пора бы или запомнить, или в закладки занести, компилируем Форексом A = A/2.0 в режиме *FULL, наблюдаем

  00001 /0001/ PЖA  ’00002’
               CЧ   A
  00002        CЛПA ’00077’
               ЗП   A

И попробуй сказать, что это не работает. По секрету скажу, что если написать в качестве делителя целую двойку, то результат идентичен, а если целую переменную то она перед делением нормализуется. Проблемы с делением на целое были только в Фортране-Дубна по очевидной причине. Так что на попытку оторвать руки я бы отрывал голову, приговаривая "пользоваться надо правильными инструментами, а не этой кастрюлей".

 Leo

Василий Долматов

unread,
Mar 27, 2025, 2:48:22 AMMar 27
to be...@googlegroups.com


27 марта 2025 г., в 09:33, Leo B. <leo...@gmail.com> написал(а):
замечу. что  работали мы с этим тогда, когда только-только появились версии -ГДР Алгола и Фортрана (на которые мы практически сразу перешли), 
а попытки использовать «форекс» заканчивались криком: «Пятачок, неси ружьё!» потому как сравнительно со всеми, имевшимися на тот момент языками, именно «форекс» и был «дырявой кастрюлей"… 

и все время, пока я занимался численными расчетами на Б-6 (года до 83-го), он был полностью непригоден для какой-либо серьезной работы, в частности, потому, что в режиме *OPTIM периодически генерил код, считавший откровенную ерунду
(и это еще надо было суметь заметить), а в режиме *NO OPT - был хуже F-ГДР по скорости. 

так что - руки отрывали совершенно не зря… :) 
у нас были конкретные задачи, которые нужно было решать в конкретные сроки, и от правильности решения многое зависело.

а не играться со всяким косорылым (зато «продвинутым») софтом. 

:) 

dol@


Leo Broukhis

unread,
Mar 27, 2025, 2:55:18 AMMar 27
to be...@googlegroups.com
Это всё замечательно, но факт, что деление на 2 прекрасно делается декрементом порядка, остаётся правдой.

Leo

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/51B6E7EE-80E1-45EF-95A7-AE0FF97C2DC1%40gmail.com.

Василий Долматов

unread,
Mar 27, 2025, 3:52:43 AMMar 27
to be...@googlegroups.com


> 27 марта 2025 г., в 09:55, Leo Broukhis <le...@mailcom.com> написал(а):
>
> Это всё замечательно, но факт, что деление на 2 прекрасно делается декрементом порядка, остаётся правдой.
>
> Leo
>
спасибо за напоминание про эмулятор, посмотрел на кодогенерацию FTN и FOREX - да, немцы более методичны, а форексоиды - хотят добиться большего :)

по крайней мере у них кусочки кода четко соответствуют исходным операторам, а в форексе - изрядное жонглирование :)

кстати, а какой картой делается одноколоночный листинг того же *FULL не напомните? :)


Leo B.

unread,
Mar 27, 2025, 10:42:49 AMMar 27
to БЭСМ-6
Одноколоночный листинг делается с помощью *SUPER, как мне кто-то в этой группе много лет назад сказал.

Логики названия я не вижу. :)

Василий Долматов

unread,
Mar 28, 2025, 6:29:28 AMMar 28
to be...@googlegroups.com
да, хрен вычислишь :)

«Это невозможно понять, это надо запомнить!» (с) анекдот :)

27 марта 2025 г., в 17:42, Leo B. <leo...@gmail.com> написал(а):

Alex Loktionoff

unread,
Apr 1, 2025, 3:35:05 PMApr 1
to БЭСМ-6
Кто знает интринсики gcc/clang аналогичные командам  упаковки/распаковки APX/AUX ?
Вообще очень понятные команды, можно использовать для всего. Для БЭСМ6 нет понятия endianess процессора, как хочешь так и пиши.  Только вот реализованы они были очень просто и медленно, но это совсем другая история.
А вот современных аналогов я недополучил ни от godbolt ни от copilot :(

среда, 15 февраля 2023 г. в 21:49:17 UTC+1, Alex Loktionoff:
Кто знает как быстрее всего на автокоде swap Cумматор <-> П(М15-1) A<->B

Leo B.

unread,
Apr 1, 2025, 6:11:30 PMApr 1
to БЭСМ-6
On Tuesday, April 1, 2025 at 12:35:05 PM UTC-7 oxy...@gmail.com wrote:
Кто знает интринсики gcc/clang аналогичные командам  упаковки/распаковки APX/AUX ?

Боюсь, нет таких интринсиков. 
 
Вообще очень понятные команды, можно использовать для всего. Для БЭСМ6 нет понятия endianess процессора, как хочешь так и пиши.  Только вот реализованы они были очень просто и медленно, но это совсем другая история.

О да. Было дело, пытался я когда-то синтезировать комбинационную логику, реализующую эти операции.  Получились бешеные тысячи LUTs.

Leo

Michael Yaroslavtsev

unread,
Apr 1, 2025, 8:54:39 PMApr 1
to be...@googlegroups.com
On Tue, Apr 1, 2025 at 3:11 PM Leo B. <leo...@gmail.com> wrote:
On Tuesday, April 1, 2025 at 12:35:05 PM UTC-7 oxy...@gmail.com wrote:
Кто знает интринсики gcc/clang аналогичные командам  упаковки/распаковки APX/AUX ?

Боюсь, нет таких интринсиков. 
Чертовски жаль, что не пришла в своё время в голову идея расспросить usual suspects о том, кто именно и почему эти операции выдумал. А теперь уже некого. В.И.Смирнов последний был, а я у него в гостях побывал не сильно давно.
За пределами вселенной БЭСМ я нигде с идеей таких операций не встречался.
 
Вообще очень понятные команды, можно использовать для всего. Для БЭСМ6 нет понятия endianess процессора, как хочешь так и пиши.  Только вот реализованы они были очень просто и медленно, но это совсем другая история.

О да. Было дело, пытался я когда-то синтезировать комбинационную логику, реализующую эти операции.  Получились бешеные тысячи LUTs.

Leo

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/c9da791c-fe07-4b09-94ea-b5beb568cab4n%40googlegroups.com.


--
Thanks,
-- Michael

Leo B.

unread,
Apr 1, 2025, 9:28:06 PMApr 1
to БЭСМ-6
Кстати, мгновенно находится, если знать правильные слова "gather bits by mask instruction".

http://palms.ee.princeton.edu/system/files/Hilewitz_JSPS_08.pdf стр. 21

  8 Related Work

Advanced bit manipulation operations have usually been supported only by supercomputers. The Soviet BESM-6 supercomputer had pack and unpack instructions which are similar to pex and pdep, respectively [37].

 А [37], кто бы мог подумать,  37. Broukhis, L. A. “BESM-6 Instruction Set,” available online: http://www.mailcom.com/besm6/instset.shtml.

Leo   



Leo B.

unread,
Apr 1, 2025, 9:33:27 PMApr 1
to БЭСМ-6

Alex Loktionoff

unread,
Apr 2, 2025, 1:55:30 PMApr 2
to БЭСМ-6
хе хе, ищущий да обрящет 

 широко известные в узких кругах интринсики являютя 100% аналогами:
#include <immintrin.h> 
_pdep_u64(src, mask);
_pext_u64(src, mask);

Появились инструкции позновато, только начиная с haswell и появляются только при компиляции начиная с -mbmi2
        dep
        pext

есть соответствующие builtin-ы, для них заголовок подключать ненадо, но все равно компиляция падает без -mbmi2 
__builtin_ia32_pdep_di(src, mask);
__builtin_ia32_pext_di(src, mask);

В общем, копаясь в ретрокомпьютере прошлого века, на пятом десятке накопал подозрительно много нового. :-)
среда, 2 апреля 2025 г. в 02:54:39 UTC+2, BOPOHOK:

Alex Loktionoff

unread,
Apr 2, 2025, 3:01:15 PMApr 2
to БЭСМ-6
Помогите пожалуйста преобразовать число с 0-вым порядком.
Я блокирую нормализацию, чтоб было быстрее, команда , E+N , 64+32 еще работает а , E+N , 64+64 уже дает абсолютный 0
А мне хочется получить 6400000000000123
Что я делаю не так?

  9  РRОGRА:    ,ЕNТRУ,

  8             , LOC , 1000B

  7  MAIN:    7 , VТМ , *С

  6             , NTR , 3

  5             , САLL, OKHO

  4           7 , XTA , X-*С

  3             , САLL, OKHO

  2           7 , А+X , Y-*С

  1             , САLL, OKHO

  0             , E+N , 64+64

  1             , САLL, OKHO


 LIВRАRУ ОТ  26.02.82 М3

           *NО LОАD LISТ

           *МАIN МАIN

           *ЕХЕСUТЕ

0000000000000000          003   03122 00000 06614 73254 03271 10012 01015 26515 03656 00610 00000 77774 01002 00770 75402

0000000000000123          007   03122 00000 06614 73254 03271 10012 01015 26515 03656 00610 00000 77774 01003 00770 75402

0000000000000123          023   03122 00000 06614 73254 03271 10012 01015 26515 03656 00610 00000 77774 01004 00770 75402

0000000000000000          013   03122 00000 06614 73254 03271 10012 01015 26515 03656 00610 00000 77774 01005 00770 75402


среда, 26 марта 2025 г. в 22:09:07 UTC+1, Leo B.:
On Wednesday, March 26, 2025 at 1:28:34 PM UTC-7 oxy...@gmail.com wrote:
 
При включенной нормализации самый быстрый способ умножить число с плавающей точкой на 2 - это инкрементировать его порядок (,E+N,64+1 )
Получается без дополнительного обращения к памяти, да еще на заданное число в регисте раз? Круто.
Только две разные команда для сдвига влево/право  /*умножения/деления*/?

Поделить на 2, соответственно, ,E+N,64-1 (или, если угодно, ,E-N,64+1)

Не помешает внимательно изучить, как работают команды корректировки порядка.
Согласен, я дал маху, что-то не разберусь.
 
Leo 

Michael Yaroslavtsev

unread,
Apr 2, 2025, 3:52:39 PMApr 2
to be...@googlegroups.com
On Wed, Apr 2, 2025 at 10:55 AM Alex Loktionoff <oxy...@gmail.com> wrote:
хе хе, ищущий да обрящет 

 широко известные в узких кругах интринсики являютя 100% аналогами:
#include <immintrin.h> 
_pdep_u64(src, mask);
_pext_u64(src, mask);

Появились инструкции позновато, только начиная с haswell и появляются только при компиляции начиная с -mbmi2
        dep
        pext

есть соответствующие builtin-ы, для них заголовок подключать ненадо, но все равно компиляция падает без -mbmi2 
__builtin_ia32_pdep_di(src, mask);
__builtin_ia32_pext_di(src, mask);
Надо бы эмулятор подковать. 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/090e2519-a4f9-4372-a463-bdefa93cd7c3n%40googlegroups.com.


--
Thanks,
-- Michael

Leo B.

unread,
Apr 2, 2025, 5:27:34 PMApr 2
to БЭСМ-6
Всё очень просто. Не вдаваясь в подробности двоичного представления поля порядка, чтобы сделать из числа с минимальным порядком (-64) число с порядком, представляющим целое (+40), нужно скорректировать его на 104. Но команды E+N и E-N (опять же, не вдаваясь в подробности представления операнда) могут зараз корректировать не более чем на -64 <= N <= 63. Итого выходит, что нужно две такие команды. Например,

 0000                          , NTR ,3
  -                            , XTA ,=12345
 0001                          , CALL,OKHO
  -
 0002                          , E+N ,64+63
  -                            , CALL,OKHO
 0003                          , E+N ,64+41
  -                            , CALL,OKHO
 0004                          , CALL,STOP*
  -
                               , END ,
 ЧИCЛO ПEPФ. 0010      ЧИCЛO OШИБ. OПEPATOPOB  0000
           *EXECUTE

0000000000012345          007   02362 20717 22731 00000 77770 22731 05534 22747 23474 01154 02020 01770 01002 00770 53402
3740000000012345          013   02362 20717 22731 00000 77770 22731 05534 22747 23474 01154 02020 01770 01003 00770 53402
6400000000012345          013   02362 20717 22731 00000 77770 22731 05534 22747 23474 01154 02020 01770 01004 00770 53402


Поэтому так обычно не делали, а целый порядок добавлялся просто наложением константы "целый 0". Наложение в подобных случаях традиционно делалось командой AEX, а не AOX, потому что AEX была на такт быстрее.
 
Leo

Mikhail Popov

unread,
Apr 2, 2025, 8:43:18 PMApr 2
to be...@googlegroups.com

Алекс,

 проще использовать (если в этом есть необходимость, например: программа  больше 4K) конструкцию

  7, BASE, *

ассемблер сам сделает всё что надо для базирование
М.П.


--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/238773cc-4942-4bf9-9659-96623b3ed5e5n%40googlegroups.com.

Mikhail Popov

unread,
Apr 3, 2025, 1:22:49 AMApr 3
to be...@googlegroups.com
Традиционно билист в Дубне управляется картой

*CALL PUTFLAG*
40

Где 40 это бит отмены билиста


М.П.


--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/ec9d70c1-ba9c-4f56-ad46-99467881e349n%40googlegroups.com.

Serge Vakulenko

unread,
Apr 10, 2025, 3:55:19 PMApr 10
to be...@googlegroups.com
On Wed, Apr 2, 2025 at 10:22 PM Mikhail Popov <mikha...@gmail.com> wrote:
Традиционно билист в Дубне управляется картой
*CALL PUTFLAG*
40
Где 40 это бит отмены билиста 
М.П.

А есть еще:

*call setftn:one

--Сергей

Alex Loktionoff

unread,
Jun 29, 2025, 5:20:45 AMJun 29
to БЭСМ-6
Кто знает как быстрее всего на автокоде реализовать sign extend  char -> int?
 То-есть если в аккумуляторе 0x80 то получить 0x1FFFFFFFFF80. /* если можно заодно и с порядком 64 :) */
0x1 - > 0x1
0xFF -> 0x1FFFFFFFFFFF
и.т.д 

На сколько можно ускорить:

18           15 , ATX ,

  1             , AAX , =200

  2             , UZA , NOSEX

  3             , XTA , =6437777777777200

  4  NOSEX  :15 , AOX ,

Mikhail Popov

unread,
Jun 29, 2025, 11:49:47 PMJun 29
to be...@googlegroups.com
Видно все отдыхают ,,,,

как-то вот так

*name   aa
*madlen,l=fg.
  program:,name,
  neg:,macro,
  ,arx,=6h'000''377''377''377''377''200'
  ,aex,=6h'320''377''377''377''377''200'
  ,endm,
  ,xta,one
  ,call, okho
  ,xta,=177
  ,call, okho
  ,neg,
  ,call, okho
  ,xta,=200
  ,call, okho
  ,neg,
  ,call, okho
  ,sj,
  one:,int,-128
  ,end,
*execute
*end file

*EXECUTE

         PROGRAM    01000                BOKHO      01015                OKHO     E 01052                CBOБOДHO   01130

6437777777777600          006   02275 01470 01466 77735 77770 06012 32005 25672 00000 07405 07447 00000 01001 00770 53403
0000000000000177          006   02275 01470 01466 77735 77770 06012 32005 25672 00000 07405 07447 00000 01002 00770 53403
6400000000000177          006   02275 01470 01466 77735 77770 06012 32005 25672 00000 07405 07447 00000 01004 00770 53403
0000000000000200          006   02275 01470 01466 77735 77770 06012 32005 25672 00000 07405 07447 00000 01005 00770 53403
6437777777777600          006   02275 01470 01466 77735 77770 06012 32005 25672 00000 07405 07447 00000 01007 00770 53403
------------------------------------------------------------

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/902876b6-a487-4e5f-9bfd-d975ec656c7dn%40googlegroups.com.

Michael Yaroslavtsev

unread,
Jun 30, 2025, 3:28:04 AMJun 30
to be...@googlegroups.com
On Sun, Jun 29, 2025 at 8:49 PM Mikhail Popov <mikha...@gmail.com> wrote:
Видно все отдыхают ,,,,

как-то вот так
Ты смену знака написал, а тут sign extension просили.
Вот так, например. 4 команды, две константы.
     МАКРО-БЕМШ ВЕР.06/78      РRОG     СТР 0001
ОШИБКИ   НПК  СВОБ ПЕРЕМ АДРЕС КОМАНДА    А ИСП N ГЕН N ИСХ МЕТКА  ОПЕРАЦИЯ ОПЕРАНД   КОММЕНТАРИЙ
                                                 0001  0001 РRОG   СТАРТ 512
         001             01000 15 044 0014       0002  0002        УИИ   12(13)
                               00 010 1005       0003  0003        СЧ    СНАR
                                                 0004  0004 * НАЧАЛО АЛГОРИТМА
                         01001 00 037 0003       0005  0005        РЖА   3
                               00 013 1006       0006  0006        СЛЦ   =В’6400000000000200’
                         01002 00 011 1007       0007  0007        И     =В’7777777777777377’
                               00 005 1006       0008  0008        ВЧ    =В’6400000000000200’
                                                 0009  0009 * КОНЕЦ АЛГОРИТМА
                         01003 00 22
            + 0001             15 31  0000       0010  0010        ПВ    ОКНО(13)
                         01004 14 30 00000       0011  0011        ПБ    (12)
                               00 22
                         01005  0000000000000200 0012  0012 СНАR   КОНД  В’200’
                                                 0013  0013 ОКНО   ВНЕШД ОКНО
                         01005                   0014  0014        ФИНИШ
         002             01006  6400000000000200
                         01007  7777777777777377
РRОG     НАМ=01000   ДИАП ЗАГР=00001-07770  ДЛИНА МОДЛ=00001  ДЛИНА ПРОГ=00010 ВХОДН=00001 ВНЕШН=00001 ЧИСЛО МЕТОК=00004
 **********
ЧИСЛО ОШИБОК=0000. МАКС СЕРЬЕЗН=0.
ЗАГР: 12.78
           *ЕХЕСUТЕ
6437777777777600          023   01116 74005 04044 06022 00000 00000 00000 00000 02310 71777 02020 00774 01004 00770 53402
 КОНЕЦ ЗАДАЧИ
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CAHBB7Y5hkGwew9Oou-5JTw_Z%2Bg9tCMuYG_nXGz2sbn9T89%2BFow%40mail.gmail.com.


--
Thanks,
-- Michael

Mikhail Popov

unread,
Jun 30, 2025, 8:47:41 AMJun 30
to be...@googlegroups.com
не вижу разницы в результате,  и там и там размножается 8 бит 

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CADLwzue5Fovq%2BXVdjPmDpbj6z9SkDCHT1zCyUadH2NZyY_AtFQ%40mail.gmail.com.

Michael Yaroslavtsev

unread,
Jun 30, 2025, 3:35:24 PMJun 30
to be...@googlegroups.com
On Mon, Jun 30, 2025 at 5:47 AM Mikhail Popov <mikha...@gmail.com> wrote:
не вижу разницы в результате,  и там и там размножается 8 бит 
Да, ты прав, всё красиво, а я плохо читал. 
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CAHBB7Y4YVgy_vcV_em3vf71fxf4J92hWDn5Eh7WNa2F1zXtitA%40mail.gmail.com.


--
Thanks,
-- Michael

Leo B.

unread,
Jul 18, 2025, 3:31:26 PMJul 18
to БЭСМ-6
On Wednesday, February 15, 2023 at 12:49:17 PM UTC-8 oxy...@gmail.com wrote:
Кто знает как быстрее всего на автокоде swap Cумматор <-> П(М15-1) A<->B

   15 AEX -1     #A^B                                  +1
   15 ATX         #*(SP++)=A^B                  +1
    YTA              #A
    15 ATX -2    #*(SP-2)=A                       +1
    15 AEX        #A^*(--SP)      //A^(A^B)  +1

4 обращения к кешу и сколько тактов мне трудно сказать...
Кто меньше?

Долго же я тупил. Обмен содержимого сумматора (acc = A) с произвольной ячейкой памяти, отличной от первой свободной ячейки магазина (mem = B), делается так:

     AEX mem ; acc = A ^ B, Y = A
     AEX mem; acc = A; Y = A ^ B
     ATX mem; mem = A
     YTA; acc = A ^ B
     AEX mem; acc = B

Итого те же 5 команд, те же 5*3 = 15 тактов в УУ, но в АУ, возможно, на реальной машине было бы на такт быстрее (из-за двух AEX подряд), и приятно, что никакие другие ячейки памяти не изменяются.

 Leo
 
Reply all
Reply to author
Forward
0 new messages