-
- Странно. 3 дня прошло, но никто не вспомнил, что у 8051 умножитель
был реализован в виде ПЗУ 8х8? - BlackMorda(18.04.2024 19:48)
- Ну, то есть, интеля от шедрот потратили 64К ПЗУ на умножитель, но
на память программ (масочную) выделили только 4К? - LightElf(19.04.2024 21:06)
- Если пользоваться формулой a*b = ((a+b)^2 - (a-b)^2)/4 ,
упорядочить а b, учесть случаи разной и одинаковой четности
множителей, то необходимо - 256 слов по 16 бит = 512 байт. Boвa(844 знак., 22.04.2024 16:36 - 16:39)
- Тама выше указано про использование ПЗУ 8x8. Кроме того,
оригинальный MCS-51 умножал 8x8 за 4 цикла (48 тактов). Так что
матричного умножителя в нем не просматривается. А вот
последовательное умножение по два разряда за цикл - вполне. LightElf(10 знак., 22.04.2024 17:08, ссылка)
- ПЗУшный умножитель 8*8 проще сделать из 4 4*4 и 3 сумматоров. - mse homjak(22.04.2024 21:28)
- Не получается 4 машинных цикла. - LightElf(23.04.2024 14:35)
- Не скажу за циклы, но за 3 такта, легко: mse homjak(77 знак., 23.04.2024 17:23)
- Дык я о том и говорю, что получается 3 цикла, а не 4. То есть "нэ
так все было". - LightElf(23.04.2024 17:35)
- Видимо, стандартное "сдвиг-сложэние". Но там, ИМХО, тожэ укладывается в 8, ну пусть, 16 тактов. - mse homjak(24.04.2024 11:03)
- Дык я о том и говорю, что получается 3 цикла, а не 4. То есть "нэ
так все было". - LightElf(23.04.2024 17:35)
- А там 48 тактов, а не 4 машинных цикла :) А так да, интересно как
это сделали - symbions(23.04.2024 14:49)
- а чем они отличаются по числу клоков? )) - POV(23.04.2024 14:50)
- в оригинале минимальное время исполнения команды 12 тактов
задающего генератора. - Zoro(23.04.2024 15:28)
- Есть машинный цикл. В оригинале он 12 тактов (6 фаз). Всё к этому делу и привязано. Так 48 тактов или 4 МЦ - однохуйственно. - POV(23.04.2024 15:50)
- Для "однотактовых" клонов 8051 время выполнения MUL - 4такта.
Среднее время выполнения обычной команды (арифметика, пересылки)
2-3 такта. NOP - 1 такт :) - AlexBi(23.04.2024 15:34)
- Я думаю там те же 12 клоков на МЦ. "Просто" оно скрыто от
пользователя 12ю тактовыми сигналами с смещением. - POV(23.04.2024 15:54)
- АВРки смогли 1 команда - 1 такт. Просто по разным фронтам. - mse homjak(23.04.2024 17:17)
- Не обязательно. Могли просто внутреннюю шину "широкой" (да хоть
128256 разрядов!) сделать. - reZident(23.04.2024 16:35)- И как это поможет команде ADD A,#50?... POV(373 знак., 23.04.2024 16:43)
- Ну вот "однотактовый" ADuC84x, например, эту команду (ADD A,#50) за
2 цикла выполняет. Где цикл = тактовому импульсу. reZident(1 знак., 23.04.2024 17:10, картинка)
- А у "однотактного" MG82F6D17 - ровно на такт больше. Зато у него
INC DPTR однотактный (если даташит не врет). Короче, в новых черт
ногу сломит. Обсуждать есть смысл только оригинал. LightElf(1 знак., 23.04.2024 17:32, картинка)
- Ну да, недавно вон при 32х битный 51 ссылка была )) Гугл перевод китайского DS не дал ни малейшего понимания как при сохранении совместимости это может работать... POV(147 знак., 23.04.2024 17:38 - 18:02)
- Я ж писал выше - это то, что доступно пользователю. Внутренней кухни он не знает... а мы же именно о кухне говорим?... POV(407 знак., 23.04.2024 17:26, картинка)
- А у "однотактного" MG82F6D17 - ровно на такт больше. Зато у него
INC DPTR однотактный (если даташит не врет). Короче, в новых черт
ногу сломит. Обсуждать есть смысл только оригинал. LightElf(1 знак., 23.04.2024 17:32, картинка)
- Ну вот "однотактовый" ADuC84x, например, эту команду (ADD A,#50) за
2 цикла выполняет. Где цикл = тактовому импульсу. reZident(1 знак., 23.04.2024 17:10, картинка)
- И как это поможет команде ADD A,#50?... POV(373 знак., 23.04.2024 16:43)
- "Не верю". Всё-таки с момента появления i8051 тулзы для
проектирования чипов шагнули вперёд, можно сделать и однотактный
проц. - SciFi(23.04.2024 16:30)
- "я думаю" что все однотактные ни разу не однотактные, а как раз работают по смещенным клокам... POV(209 знак., 23.04.2024 16:40)
- Я думаю там те же 12 клоков на МЦ. "Просто" оно скрыто от
пользователя 12ю тактовыми сигналами с смещением. - POV(23.04.2024 15:54)
- в оригинале минимальное время исполнения команды 12 тактов
задающего генератора. - Zoro(23.04.2024 15:28)
- а чем они отличаются по числу клоков? )) - POV(23.04.2024 14:50)
- Не скажу за циклы, но за 3 такта, легко: mse homjak(77 знак., 23.04.2024 17:23)
- Смотря кому проще. Дезигнер сделает мегатабличку и передаст на производство, пусть они там ипуцца. Ему так проще! :-) - SciFi(22.04.2024 21:33)
- Не получается 4 машинных цикла. - LightElf(23.04.2024 14:35)
- Я художник, я так вижу. - Boвa(22.04.2024 21:03)
- ПЗУшный умножитель 8*8 проще сделать из 4 4*4 и 3 сумматоров. - mse homjak(22.04.2024 21:28)
- (а+б) - 9 бит. дальнейшее возведение в двойку - 18 бит. - POV(22.04.2024 16:39)
- Тама выше указано про использование ПЗУ 8x8. Кроме того,
оригинальный MCS-51 умножал 8x8 за 4 цикла (48 тактов). Так что
матричного умножителя в нем не просматривается. А вот
последовательное умножение по два разряда за цикл - вполне. LightElf(10 знак., 22.04.2024 17:08, ссылка)
- Если пользоваться формулой a*b = ((a+b)^2 - (a-b)^2)/4 ,
упорядочить а b, учесть случаи разной и одинаковой четности
множителей, то необходимо - 256 слов по 16 бит = 512 байт. Boвa(844 знак., 22.04.2024 16:36 - 16:39)
- А делитель? .. а какое нахрен ПЗУ если это требует столько тактов (4, Карл, машинных циклов - 48 тактов)... POV(55 знак., 19.04.2024 20:53)
- А какая разница, как оно реализовано, чтобы об этом вспоминать или,
вообще, знать? - mse homjak(18.04.2024 20:23)
- Не знаю. Возможно ардуинщики правы? - BlackMorda(19.04.2024 20:30)
- Ну, то есть, интеля от шедрот потратили 64К ПЗУ на умножитель, но
на память программ (масочную) выделили только 4К? - LightElf(19.04.2024 21:06)
- Скорее всего, ответ на вопрос "почему" - а просто им по барабану.
Так проще, меньше возни. Но хотелось ли вам знать этот ответ? - SciFi(16.04.2024 15:38)
- Как цынично ((( - Kpoк(16.04.2024 23:38)
- Такой ответ меня устроит. Мне надо узнать стоит ли искать как
уговорить оптимизатор работать лучше, или надо смириться с тем что
лучше он не может и пользоваться тем, что есть. - AlexBi(16.04.2024 16:19)
- Смириться или подсовывать свои математические функции. POV(1 знак., 16.04.2024 16:28, ссылка)
- +1. Уговаривать компилятор выдать желаемый код - так себе занятие.
Вроде бы есть способы привлечь ассемблер. Если действительно проц
не успевает. - SciFi(16.04.2024 17:32)
- На 8051 смысл есть. Как минимум выбирать типы переменных и раскладывать их по разным областям памяти весьма кошерно. И не забывать про то, что в Кейле по умолчанию функи нереентерабельны. - LightElf(19.04.2024 22:40)
- Ну кейл и предлагает переходить на ассемблер, если его подходы на сишнике не устраивают ))... POV(134 знак., 16.04.2024 17:34)
- +1. Уговаривать компилятор выдать желаемый код - так себе занятие.
Вроде бы есть способы привлечь ассемблер. Если действительно проц
не успевает. - SciFi(16.04.2024 17:32)
- Смириться или подсовывать свои математические функции. POV(1 знак., 16.04.2024 16:28, ссылка)
- MUL и DIV используются. Для F130 даже MAC16x16 используется... POV(115 знак., 16.04.2024 09:07, картинка)
- Херова гора операций получается из-за того, что компилятор
почему-то не догадывается сообразить, что u16*u16=u32 и не хочет
оптимизировать u8*u16 или u8*u32, вместо этого приводит все к u32 и
вызывает библиотечную функцию. - AlexBi(16.04.2024 15:30)
- На сайте кейла приводился пример на асме как подсунуть ему оптимизированную под себя функцию умножения. Например uint16*uint16=uint32 без преобразования операндов в uint32 POV(600 знак., 16.04.2024 16:25)
- Может код в студию? Я по своим давним воспоминаниям сужу - тоже у
меня было беспокойство насчет неадекватных вызовов функций
умножения/деления "не той разрядности". Но в большинстве (не во
всех) случаях оказывалось что компилятор поступал правильно, не
оптимизируя мои выражения в соответствии с моими представлениями. - il-2(16.04.2024 15:38)
- Немного ниже мой пример. Там u16*u8. Кстати, что бы получить u32 после u16*u16 надо превратить u16 в u32 и выполнять умножение u32*u32. AlexBi(1 знак., 16.04.2024 16:17, ссылка)
- Херова гора операций получается из-за того, что компилятор
почему-то не догадывается сообразить, что u16*u16=u32 и не хочет
оптимизировать u8*u16 или u8*u32, вместо этого приводит все к u32 и
вызывает библиотечную функцию. - AlexBi(16.04.2024 15:30)
- С делением странно, возможно что оптимизатор здесь пасует из-за
знакового числа. Если сдвигами, это получается 8*4 = 32 операции
сдвига. Делением может быть быстрее, но конечно не long на long... - il-2(16.04.2024 08:21)
- Не... Деление у 51, это как пистолет у полкана-енерала. Чтобы застрелиться в случае чего. - mse homjak(16.04.2024 10:28)
- Так ведь встроенный умножитель там 8-битный, да еще беззнаковый. Если явно не указывать преобразования типов, то компилятор промотит операции до знаковых 2-байтовых. И в библиотечных функциях используются те-же инструкции 8-битного умножения, только по несколько штук и с учетом знака. В некоторых случаях компилятору надо явно преобразованием типов урезать разрядность операндов (а иногда и результата). - il-2(16.04.2024 08:13)
- А можно предметнее, на что именно вы жалуетесь? что наблюдаете и
как по-вашему должно быть? К примеру, при простых умножениях я
вполне вижу в листинге наличие инструкции MUL. - pavel2000(15.04.2024 20:23)
- У меня MUL получается только при u8*u8 все остальные варианты
приводят к вызову библиотечной функции умножения. Вот пример: AlexBi(2223 знак., 16.04.2024 15:13)
- Тема ?C?IMUL не раскрыта. Думаю, там 3 операции умножения с возвратом 2-байтового результат (4 умножения не нужно, т.к. умножения 2-х старших байт перевалит за 2-байтовый результат). il-2(310 знак., 16.04.2024 16:39)
- Зайди в C?IMUL - там будет активно использоваться команда MUL - POV(16.04.2024 15:14)
- У меня MUL получается только при u8*u8 все остальные варианты
приводят к вызову библиотечной функции умножения. Вот пример: AlexBi(2223 знак., 16.04.2024 15:13)
- Странно. 3 дня прошло, но никто не вспомнил, что у 8051 умножитель
был реализован в виде ПЗУ 8х8? - BlackMorda(18.04.2024 19:48)