Dmitry K. wrote:
On Wednesday 12 December 2007 01:16, Albert Andras wrote:
- Original Message -
From: Nathan Moore [EMAIL PROTECTED]
unsigned char a, b, c;
c = some_input_function();
LABEL:
a = c/10;
b = c%10;
...
*
LABEL:
mov r24,r18
ldi
Gre7g Luterman wrote:
[...]
Well if size speed are getting you down, try this:
http://pastie.textmate.org/127218
The calculation takes 22 bytes and executes in 40
clocks. As an assembly-language programmer, having
that extra MOV in the beginning annoys me, but hey, I
try not to break the asm
Thank you for your explination Bjoern.
I have looked at GCC internals before, but never worked on them, so I'm
likely to say something stupid.
I would have thought that an optimization pattern for just this type of
thing would have already been in GCC, especially since on the internal
helper
Paulo Marques wrote:
[...]
a = (c * 65534) 16;
b = c - (a * 10);
leaving you with no divisions to perform.
The main problem is that the first multiplication should be done with
some hand optimized assembly to perform a 8x16 bit multiplication,
leaving just the upper 8 bits of a 24 bit
-Original Message-
From:
[EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED]
org] On Behalf Of Nathan Moore
Sent: Tuesday, December 11, 2007 9:26 AM
To: avr-gcc-list@nongnu.org
Subject: RE: [avr-gcc-list] dev and mod may not be optimized
Thank you for your explination Bjoern.
I
--- Paulo Marques [EMAIL PROTECTED] wrote:
Actually after a few more digging, we can do this
all in plain C, by
using a smaller reciprocal multiplier:
snipped
Wow, that's freakin' inspired! And you're right it
does optimize nicely. Here's a 20 byte version that
executes in 12 cycles:
Gre7g Luterman wrote:
--- Paulo Marques [EMAIL PROTECTED] wrote:
Actually after a few more digging, we can do this
all in plain C, by
using a smaller reciprocal multiplier:
snipped
Wow, that's freakin' inspired!
Thanks :)
It's not really a new idea, though. Using multiply by the