Повторяя пройденное.

А именно, тему быстрого деления на 10, затронутую здесь:
24 бита число в строку, используя быстрое деление на 10.
Теперь решил опробовать алгоритм, предложенный lizard66.

Напоминаю, что оригинал алгоритма http://forum.easyelectronics... делит на 10 тридцатидвухбитное число и выполняется за 87 тактов.
Попробуем слегка обточить напильником… Отучаем от использования старших регистров, делаем один и тот же аргумент на входе и выходе, и в результате получаем 75 тактов.
Уже неплохо.
Всего на два(!) такта медленнее, чем процедура из моего прошлого поста, но там было 24 бита, а здесь таки 32. Теперь режем разрядность, пробуем…
… И получаем 61 такт.
Шестьдесят один, Карл!
Чтобы разделить 24бита на десятку.
Это круто, это по-настоящему круто. Пробуем сделать из этого конвертер в строку.
Лучшее время — 81 такт. Худшее — 591 такт. Быстрее я ещё не видел.

В приложении коллекция быстрых делений на 10:
fastidiv10.asm — оригинальный алгоритм от lizard66
FastDiv32.asm — он же, после напильника.
FastDiv24b.asm — обрезанный до 24х бит.
FastDiv16.asm — 16бит версия от THE BEAST.
Bin2str24c.asm — конвертер 24бит в строку.


;*****************************************************************
; Быстрое деление 24хбитного числа на 10 
; параметр на входе var10~12
; на выходе var10~12, r0 = остаток 
; временные регистры var14, var15, var16, r16
; 61t
;*****************************************************************
FastDiv24b:	mov	r0, var10
		lsr	var12
         	ror	var11
         	ror	var10
         	movw	var14, var10
         	mov	var16, var12
;-------------------------------------
         	lsr	var12
         	ror	var11
         	ror	var10
         	add	var14, var10
         	adc	var15, var11
         	adc	var16, var12
         	movw	var10, var14
         	mov	var12, var16
;-----------------------------------
         	lsr	var16
         	ror	var15
         	ror	var14

         	lsr	var16
         	ror	var15
         	ror     var14

         	lsr     var16
         	ror     var15
         	ror     var14

         	lsr     var16
         	ror     var15
         	ror     var14

		add	var10, var14
		adc	var11, var15
		adc	var12, var16
;-------------------------------------
         	clr	r16
         	add     var10, var11
         	adc     var11, var12
         	adc     var12, r16	;+z
;-------------------------------------
         	add	var10, var12
         	adc     var11, r16	;+z
         	adc     var12, r16	;+z
		mov	r16, var10

;-------------------------------------
         	lsr	var12
         	ror	var11
         	ror	var10         

         	lsr	var12
         	ror	var11
         	ror	var10
;***************************************************************** 14 коп
         	andi	R16,$f8
         	add	R16, var10
         	cbr	R16,$1
;-----------------------------------*
         	sub	r0, R16	;   остаток частного
;-----------------------------------*
;-----------------------------------*
         	lsr	var12 
         	ror	var11 
         	ror	var10 
;-----------------------------------*
         	ldi	R16,$9
         	cp      R16, r0
         	brsh	pc+8
         	ldi	R16,$a
         	sub 	r0, R16
         	ldi	R16,$1
         	add	var10, R16         
         	ldi	R16,$0
         	adc	var11, R16	;+z
         	adc	var12, R16	;+z
		ret
  • +1
  • 25 ноября 2020, 16:13
  • Gornist
  • 1
Файлы в топике: FastDivide.zip

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.