[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-gcc-list] tinyAVR: multiplication of multi-byte integers
From: |
Wolfgang Hospital |
Subject: |
[avr-gcc-list] tinyAVR: multiplication of multi-byte integers |
Date: |
Thu, 30 Jul 2015 10:14:32 +0200 |
User-agent: |
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20110624 Thunderbird/5.0 |
For multiplication by iterated conditional additions, a different
context brought up retiring two multiplier bits per trip, which I think
too good to pass, e.g.:
__mulhi3: ; 0
movw a0, p0 ; 1
# if codePinched
clr p1 ; 2 partialProduct = 0
clr p0 ; 3
rjmp shiftM0 ; 5
# else
lsr m0 ; 2
# if greedy
brcs shiftM1 ;3/4 neither helps nor hurts worst case:
; without this, it's 4 to clear, 1 to not skip 2 to add = 7
; exp -1.5 cycles, +1 word
# endif
clr p1 ;3/4 partialProduct = 0
clr p0 ;4/5
# if !greedy
brcc shiftM1 ;5/7 said worst case
# else
lsr m1 ; 6
brcs addHigh ;7/8 8(-4)
rjmp shiftA ; 9 9(-5) -1 cycle, +4 words
# endif
# endif
addFull:
add p0,a0 ; 1
adc p1,a1 ; 2
shiftM1: ; handling this 2nd multiplier bit even
lsr m1 ; 3 if the multiplicand is zero after its
brcc pc+2 ;4/5 next/first shift adds 3 cycles to the
addHigh: ; earlyOutA variant, more with fastIn
add p1, a0 ; 5
shiftA:
add a0, a0 ; 6 why is adc zero-flag handling ...
adc a1, a1 ; 7 ... different from subc/sbci/cpc?
shiftM0: ; 7
lsr m0 ; 8
brcs addFull ;9/10
# if earlyOutA && !earlyOutA2
cpse a0,_zero;+1 _no help_ with m0's most significant 1s
# endif
sbci m1, 0 ; 10 presume a zero reg or a high reg?
brne shiftM1 ;11/12-2 early(?) out because m is zero
done: ; wc: 8*10+8+1/2=88+1/2 @14+1/2+1 words ?!
ret ; best: 14 (0=b&0xfffe) (none for a)
;(earlyOutA: wc: 8*11+6=98 @15+1/2+1 words)
(Considering the apparent enthusiasm for meta questions(&advice), this
may be going the other extreme, not elaborating on rationale&circumstances.)
regards,
HoW
--
Wolfgang Hospital
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [avr-gcc-list] tinyAVR: multiplication of multi-byte integers,
Wolfgang Hospital <=