деление в ARM
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [3.41.188.32] |
|
|
Перед отправкой сообщения внимательно прочтите правила раздела!!!

деление в ARM
|
Сообщ.
#1
,
|
|
|
|
Приветствую
В ARM нет инструкции деления Как же производить тогда это деление? |
|
Сообщ.
#2
,
|
|
|
|
наверно в столбик
, если тебе поможет могу привести вариант на С |
|
Сообщ.
#3
,
|
|
|
|
да нет, какой нафиг столбик
скорость всего в 12 раз ниже умножения (вроде) хотя давай код - посмотрю |
|
Сообщ.
#4
,
|
|
|
|
![]() ![]() // z/x unsigned int div(unsigned int z, unsigned int x) { int i; unsigned int tmp = 0; for (i = 1; i <= 32; ++i ) { tmp = (tmp << 1) | (z >> 31); z <<= 1; if (tmp >= x) { tmp -= x; ++z; } } // в tmp остаток // в z частное return z; } |
|
Сообщ.
#5
,
|
|
|
|
нет - какой-то неоптимальный алгоритм или подпорченный из-за C специфики
я переписал его на ассемблере - увеличил скорость в 4.5 раза но a/b работает еще в 5 раз быстрее - и по алгоритму его на столько не убыстрить просто наверное существует более оптимальный? |
|
Сообщ.
#6
,
|
|
|
|
Цитата Fireman @ но a/b работает еще в 5 раз быстрее ты же говорил что там нет деления |
|
Сообщ.
#7
,
|
|
|
|
нет - я написал в C++ a/b, он как-то имулировал эту функцию и она работала (эта имуляция) в 5 раз быстрее чем тот код
|
|
Сообщ.
#8
,
|
|
|
|
А пробовал посмотреть как он эмулировал?
если b константа он мог деление заменить умножением, в случае когда результат умножения записывается не в один регистр а в два, аналогично mul в x86 |
|
Сообщ.
#9
,
|
|
|
|
Цитата Fireman @ но a/b работает еще в 5 раз быстрее А "под чем" работаете ? я использую IAR для TMS470xx. Посмотрел отладчиком - там вызывается для UINT функция divu32_a, рассмотреть ее команды можно без проблем. В профешшынал версии весьма вероятно и исходники прилагаются. Однако нужно заметить, что IAR очень хорошо оптимизирует программу. Фокусы типа ![]() ![]() a=10;b=5; a = a/b; // тут компилер сам вычислит результат. // или a = getchar(); b=2; a=a/b; // компилер не будет "делить" - сгенерит коды для сдвига "не проходят". Такими способами не удается заставить компилер использовать библиотечную процедуру деления. Что приводит к весьма сильному ускорению процесса. |